在 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
})();
我有一个 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
})();