我觉得我有很好的机会找到我从木偶运算符那里获得的那些罕见的超时,但是有些人如何暂时没有抓住这个超时 – 我的问题是为什么?
这是代码:
var readHtml = (url) => {
return new Promise( async (resolve,reject)=> {
var browser = await puppeteer.launch()
var page = await browser.newPage()
await page.waitForSelector('.allDataLoaded')
.then(() => {
console.log ("Finished reading: " + url)
return resolve("COOL");
})
.catch((err) => {
console.log ("Timeout or other error: ", err)
return resolve("TRYAGAIN");
});
})}
这是错误….
(node:23124) UnhandledPromiseRejectionWarning: Error: Navigation Timeout Exceeded: 30000ms exceeded at Promise.then
(node:23124) UnhandledPromiseRejectionWarning:
Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 2)
我做了一些研究,说这可能是因为在puppeteer newPage()里面还有一些网址尚未完成
但是为什么我的.catch不会咳嗽呢?
我需要它来“TRYAGAIN”,以防它因任何原因而失败.
现在它只是因错误而停止并且什么都不做.
解决方法:
你正确地捕获了waitForSelector及其链接的promise,但是你没有为launch和newPage调用做同样的事情 – 它们之后没有连接到catch.
因为异步函数已经自动返回Promises,所以您可以考虑完全避免使用Promise构造函数:
var readHtml = async (url) => {
try {
var browser = await puppeteer.launch()
var page = await browser.newPage()
} catch(e) {
// handle initialization error
}
await page.waitForSelector('.allDataLoaded')
.then(() => {
console.log ("Finished reading: " + url)
return resolve("COOL");
})
.catch((err) => {
console.log ("Timeout or other error: ", err)
return resolve("TRYAGAIN");
});
}
或者,您可以考虑将catch放在readHtml的使用者中:
var readHtml = async (url) => {
var browser = await puppeteer.launch()
var page = await browser.newPage()
await page.waitForSelector('.allDataLoaded')
console.log ("Finished reading: " + url)
};
readHtml(someurl)
.catch((e) => console.log('err: ' + e));