Javascript 异步等待在for循环中
让我们假设在for循环中有2个等待,如何确保第一个等待完成而不抛出错误,然后执行第二个等待并再次循环。我试着用木偶演员来做这个,但是它一直在循环,即使承诺没有解决Javascript 异步等待在for循环中,javascript,asynchronous,async-await,puppeteer,Javascript,Asynchronous,Async Await,Puppeteer,让我们假设在for循环中有2个等待,如何确保第一个等待完成而不抛出错误,然后执行第二个等待并再次循环。我试着用木偶演员来做这个,但是它一直在循环,即使承诺没有解决 for(var i = 0; i < 20; i++){ console.log('loop started') await page1.goto('https://www.residentadvisor.net/dj.aspx?country=01').catch((err) =>{
for(var i = 0; i < 20; i++){
console.log('loop started')
await page1.goto('https://www.residentadvisor.net/dj.aspx?country=01').catch((err) =>{
console.log('Page load fail : '+ err)
if (err == 'Error: net::ERR_INTERNET_DISCONNECTED' || err == 'Error: net::ERR_NETWORK_CHANGED' || err == 'Error: net::ERR_NAME_NOT_RESOLVED'){
let refreshIntervalId = setInterval(() =>{
handleConnexionError(refreshIntervalId,page1)
}, 5000)
}
})
console.log('Page loaded : ' + i)
let teub = await page1.evaluate(() =>{
return document.querySelector('a').innerText
})
console.log('Evaluate done : ' + teub )
}
async function handleConnexionError(refreshIntervalId,page1){
console.log('Retrying to connect')
let errorHandle = true
await page1.goto('https://www.residentadvisor.net/dj.aspx?country=01').catch(() => {
errorHandle = false
})
if (errorHandle) {
console.log('Succesfully Reconnected')
clearInterval(refreshIntervalId)
return true
}
else {
console.log('Connection Fail Retrying in 10 sec ...')
}
}
for(变量i=0;i<20;i++){
console.log('循环已启动')
等待第1页。转到('https://www.residentadvisor.net/dj.aspx?country=01“)。捕获((错误)=>{
console.log('页面加载失败:'+错误)
如果(错误=='Error:net::err_INTERNET_DISCONNECTED'| | err=='Error:net::err_NETWORK_CHANGED'| | err=='Error:net::err_NAME_NOT_RESOLVED'){
让refreshIntervalId=setInterval(()=>{
HandleConnectionError(刷新有效期,第1页)
}, 5000)
}
})
console.log('加载的页面:'+i)
让teub=等待第1页。评估(()=>{
return document.querySelector('a').innerText
})
log('评估完成:'+teub)
}
异步函数HandleConnectionError(refreshIntervalId,第1页){
console.log('正在尝试连接')
让errorHandle=true
等待第1页。转到('https://www.residentadvisor.net/dj.aspx?country=01)。捕获(()=>{
errorHandle=false
})
if(errorHandle){
console.log('成功重新连接')
clearInterval(刷新有效)
返回真值
}
否则{
log('连接失败,10秒后重试…')
}
}
您可以创建一个新函数,并在出现错误时递归调用它
/**
* checks if error matches
* @param {Object} err thrown error
* @return {Boolean}
*/
async function shouldRetry(err) {
return [
"Error: net::ERR_INTERNET_DISCONNECTED",
"Error: net::ERR_NETWORK_CHANGED",
"Error: net::ERR_NAME_NOT_RESOLVED"
].includes(err);
}
/**
* Function to Re navigate endlessly on error
* @param {Object} config
* @param {string} config.page the page instance
* @param {String} config.url url to browse
* @param {Number} config.delay delay for retry
* @return {Promise}
*/
async function navigateUrl({ page, url, delay }) {
try {
// wait for page load
const response = await page.goto(url);
return response;
} catch (error) {
if (shouldRetry(error)) {
// use a delay promise or the built in waitFor function
await page.waitFor(delay);
// re navigate
return navigateUrl({ page, url, delay });
} else {
// throw on other errors
throw new Error(error);
}
}
}
// now you can use them however you want
await navigateUrl({ page, 'http://example.com', 2000 });
await page.evaluate(() =>{
return document.querySelector('a').innerText
});
最好将事情分开,更易于编写和维护。不,承诺未解决时,它不会继续循环。第二部分将等待第一个
wait
ed承诺实现。您的意思是什么?什么是handleconnectionError
?展示它。另外,您可能希望在等待页面1.goto()
部分周围有一个try
/catch
,而不是.catch()
@acdcjunior我修复了它!你可以用“蓝鸟承诺”来做这件事