javascript - 在 puppeteer/JavaScript 中重试 page.goto、page.waitForNavigation 等的最佳实践

标签 javascript node.js async-await puppeteer tor

我正在尝试使用 Puppeteer 和 tor 包(apt install tor)抓取 TOR 网络中的一些网页。 可能由于 TOR 连接的性质,有时我会超时。 此外,我对 JavaScript 异步编程还不熟悉。

通常我有一个像这样的 try-catch 结构:

await Promise.all([
  page.goto(url),
  page.waitForNavigation({
    waitUntil: 'domcontentloaded'
  }),
]).catch((err) => { logMyErrors(err, true); });

let langMenu = await page.waitForXPath('//*[contains(@class, ".customer_name")]/ancestor::li').catch((err) => { logMyErrors(err, true); });

但我认为一次或多次重试通常有助于最终获得所需的资源。是否有实现重试的最佳实践?

最佳答案

我会推荐这种相当简单的方法:

async function retry(promiseFactory, retryCount) {
  try {
    return await promiseFactory();
  } catch (error) {
    if (retryCount <= 0) {
      throw error;
    }
    return await retry(promiseFactory, retryCount - 1);
  }
}

该函数调用promiseFactory,并等待返回的Promise完成。如果发生错误,该过程将(递归)重复,直到 retryCount 达到 0

代码示例

您可以像这样使用该函数:

await retry(
  () => page.waitForXPath('//*[contains(@class, ".customer_name")]/ancestor::li'),
  5 // retry this 5 times
);

您还可以传递返回 Promise 的任何其他函数,例如 Promise.all:

await retry(
  () => Promise.all([
    page.goto(url),
    page.waitForNavigation({ waitUntil: 'domcontentloaded' }),
  ]),
  1 // retry only once
);

不要结合使用await和catch

另一个建议:您不应将 await.then.catch 结合使用,因为这会导致意外问题。使用 await 并用 try..catch block 包围代码,或者使用 .then.catch。否则,您的代码可能正在等待 catch 函数的结果完成等。

相反,您可以像这样使用try..catch:

try {
  // ...
} catch (error) {
  logMyErrors(error);
}

关于javascript - 在 puppeteer/JavaScript 中重试 page.goto、page.waitForNavigation 等的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56884276/

相关文章:

c# - 如何通过 httpresponse 读取以获取返回值 :

javascript - 使用 Chokidar 忽略多个文件

javascript - 如何在 Javascript 中使用循环显示对象的特定部分

javascript - 为什么在 for 循环中为数组赋值会导致数组在传递给 console.log() 时每次迭代具有相同的值?

javascript - 来自其他文件的函数未定义

node.js - 在 mongodb 中插入当前日期时间

javascript - 如何使用 Jest 在 typescript 中模拟 Date 对象?

Node.JS MongoDB 找到 : Sequential faster than parallel, 为什么?

rust - 额外的外部异步 block 的目的是什么

javascript - Puppeteer - page.$$ ('' ).length 返回未定义