在 try 块中使用异步函数

Using asynchronous functions in try block

我有一个 puppeteer 程序,我必须在其中调用 page.waitForSelector,这是一个异步函数,以查看它是否抛出任何错误。但我假设,因为 try-block 是同步的,它不会等待异步函数完成,即使我使用 await,它也会继续执行 try-block 之后的代码,甚至在检查是否有一个错误。这是我的代码:

try {
    await page.waitForSelector("#captchaImage", {timeout: 6000});
}
catch {
    console.log("Your URL has changed");
    return;
}
console.log("You're still on the good site :)");

有没有办法解决这个问题或使异步函数同步(因此它会阻止代码执行)?

为了异步,函数必须 return 一个 Promise。然后,当 Promise 被解决或被拒绝时,可以附加像 .then().catch() 这样的处理程序来处理 return 值。处理异步操作的另一种方法是 await 它们并使当前代码块等待 Promise 解决。

您要做的第一件事是检查 waitForSelector return 是否是 Promise。它可以在其 return 语句中显式 return Promise,或者您可以在函数定义中使用 async 关键字将 return 值包装在 Promise:

async function waitForSelector(param1, param2) {
  // code goes here
  return result;
}

然后你可以附加 .then() .catch() 处理程序或使用 await 关键字同步等待结果。

try {
    // assuming that it returns some value you want to process when function finishes
    let result = await page.waitForSelector("#captchaImage", {timeout: 6000});
    console.log(result);
}
catch {
    console.log("Your URL has changed");
    return;
}
console.log("You're still on the good site :)");

请注意,您不能 await 函数之外的全局范围内的函数。这意味着您的上述代码必须放在另一个 async 函数中或包装在 IIFE 中,如下所示:

(function() {
  //above code goes here
})();