javascript - 在 for 循环中异步等待

标签 javascript asynchronous async-await puppeteer

假设我在一个 for 循环中有 2 个等待,我如何确保第一个完成而不会在执行第二个等待之前抛出错误,从而再次循环。我尝试使用 Puppeteer 执行此操作,但即使未解决 promise ,它也会继续循环...

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 ...')
    }
}

最佳答案

您可以创建一个新函数并在出错时递归调用它。

/**
 * 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
});

如果你能把东西分开,这样更容易编写和维护,那是最好的。

关于javascript - 在 for 循环中异步等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48653485/

相关文章:

javascript - AngularJS ng-change 不适用于选中的复选框

multithreading - 使用 Omni Thread Library 在 Delphi 中异步获取函数结果

javascript - Angular ,函数回调的正确方法

c# - 将任务异步到YouTube

node.js - Mongoose 模式虚拟和异步等待

python - 异步 python : How to call object methods in coroutines?

c# - html5和C#之间的web socket通信

javascript - AngularJS 循环遍历数组(一系列数字)

javascript - 为什么要避免页内 &lt;script&gt;

c# - 对 Controller 中的所有操作使用 async/await?