首页 > 解决方案 > NodeJS异步函数在while true循环内不运行

问题描述

我试图通过使用 puppeteer 捕获 cookie 并将 cookie 添加到本地 json 文件来创建 cookie 生成器。一切正常,除非我试图让函数每 5 秒运行一次,它会挂起并且永远不会完成该函数。在python中我曾经做过

while True:
   main()
   time.sleep(5)

但是在节点中我正在这样做,它挂起。它只是挂起没有错误。

while (true){
   main()
}

我的函数从不运行,它只是挂起。main这是简化的功能。

function sleep(ms) {
    return new Promise((resolve) => {
      setTimeout(resolve, ms);
    });
}

main = async () => {
    let start = now();

    puppeteer.launch( {headless:true} ).then( async (browser) => {
        console.log('Loaded Browser Successfully!')
        const page = await browser.newPage()
        await page.goto('some link')
        const cookies = await page.cookies();

        await sleep(5000)
        for(let cookie of cookies){
            if (cookie.name == 'some cookie')
                console.log(cookie)
        }
        await browser.close()
        return cookies
    }).then( async (cookies) => {
        let rawData = fs.readFileSync(path.join(__dirname,'Cookies.json'))
        let cookieJar = JSON.parse(rawData)
        cookieJar.push(cookies)
        console.log(cookieJar.length)
        await fs.writeFileSync(path.join(__dirname,'Cookies.json'), JSON.stringify(cookieJar))

        let end = now();
        console.log(`It took ${end - start}ms`)
        return
    })
    
}

我在这里做错了什么?

标签: node.jsasynchronouswhile-loopasync-await

解决方案


JS 从不并行运行代码,只能异步运行。您的异步Promise回调只能在当前执行完成后运行。由于您使用了 a while (true),它永远不会完成。

对于您的问题,setInterval是理想的:

setInterval(main, 5000)

推荐阅读