|
@@ -40,6 +40,39 @@ function wait(ms) {
|
|
})
|
|
})
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+function asyncCheck(delay, step, delayFn) {
|
|
|
|
+ return new Promise((resolve, reject) => {
|
|
|
|
+ let attempts = 0;
|
|
|
|
+ const maxAttempts = Math.ceil(delay / step); // 计算最大尝试次数
|
|
|
|
+
|
|
|
|
+ const check = () => {
|
|
|
|
+ delayFn().then(result => {
|
|
|
|
+ if (result) {
|
|
|
|
+ resolve({ result: true, type: 'check' });
|
|
|
|
+ } else {
|
|
|
|
+ attempts++;
|
|
|
|
+ if (attempts > maxAttempts) {
|
|
|
|
+ resolve({ result: false, type: 'max' });
|
|
|
|
+ } else {
|
|
|
|
+ // 如果还没有达到最大尝试次数,继续查询
|
|
|
|
+ setTimeout(check, step);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }).catch(error => {
|
|
|
|
+ // 如果delayFn抛出错误,拒绝Promise
|
|
|
|
+ logger.log.debug('检查页面状态失败', error)
|
|
|
|
+ setTimeout(() => {
|
|
|
|
+ resolve({ result: false, type: 'max-error' });
|
|
|
|
+ }, delay)
|
|
|
|
+ });
|
|
|
|
+ };
|
|
|
|
+
|
|
|
|
+ // 启动定时查询
|
|
|
|
+ check();
|
|
|
|
+ });
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+
|
|
|
|
|
|
async function createPDFOfURL (url, config = {}) {
|
|
async function createPDFOfURL (url, config = {}) {
|
|
if (!browser) {
|
|
if (!browser) {
|
|
@@ -55,6 +88,8 @@ async function createPDFOfURL (url, config = {}) {
|
|
top: 0,
|
|
top: 0,
|
|
bottom: 0
|
|
bottom: 0
|
|
},
|
|
},
|
|
|
|
+ step: 200,
|
|
|
|
+ check: true
|
|
}, config)
|
|
}, config)
|
|
// 文件路径
|
|
// 文件路径
|
|
const outPath = path.join(PATH_FILES, config.dir)
|
|
const outPath = path.join(PATH_FILES, config.dir)
|
|
@@ -75,9 +110,20 @@ async function createPDFOfURL (url, config = {}) {
|
|
try {
|
|
try {
|
|
await page.setDefaultNavigationTimeout(0)
|
|
await page.setDefaultNavigationTimeout(0)
|
|
await page.goto(url, {waitUntil: 'networkidle2'});
|
|
await page.goto(url, {waitUntil: 'networkidle2'});
|
|
- await wait(config.delay || 1000)
|
|
|
|
logger.log.debug('等待生成', new Date().toLocaleString())
|
|
logger.log.debug('等待生成', new Date().toLocaleString())
|
|
|
|
|
|
|
|
+ if (config.check) {
|
|
|
|
+ await asyncCheck(config.delay, config.step, async () => {
|
|
|
|
+ const result = await page.evaluate(() => {
|
|
|
|
+ return window.__PDF_LOADED__ || false
|
|
|
|
+ })
|
|
|
|
+ logger.log.debug('页面 __PDF_LOADED__ 状态检查', result)
|
|
|
|
+ return result
|
|
|
|
+ })
|
|
|
|
+ } else {
|
|
|
|
+ await wait(config.delay || 1000)
|
|
|
|
+ }
|
|
|
|
+
|
|
await page.pdf(outConfig);
|
|
await page.pdf(outConfig);
|
|
await page.close();
|
|
await page.close();
|
|
|
|
|