Browse Source

feat: 支持定时检查状态

zhangyuhan 1 năm trước cách đây
mục cha
commit
bb033ea352
1 tập tin đã thay đổi với 47 bổ sung1 xóa
  1. 47 1
      bin/create-pdf/pdf.js

+ 47 - 1
bin/create-pdf/pdf.js

@@ -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 = {}) {
   if (!browser) {
@@ -55,6 +88,8 @@ async function createPDFOfURL (url, config = {}) {
       top: 0,
       bottom: 0
     },
+    step: 200,
+    check: true
   }, config)
   // 文件路径
   const outPath = path.join(PATH_FILES, config.dir)
@@ -75,9 +110,20 @@ async function createPDFOfURL (url, config = {}) {
   try {
     await page.setDefaultNavigationTimeout(0)
     await page.goto(url, {waitUntil: 'networkidle2'});
-    await wait(config.delay || 1000)
     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.close();