Javascript 异步等待在for循环中

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循环中有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) =>{
        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我修复了它!你可以用“蓝鸟承诺”来做这件事