node.js - 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
})
}
我在这里做错了什么?
解决方案
JS 从不并行运行代码,只能异步运行。您的异步Promise
回调只能在当前执行完成后运行。由于您使用了 a while (true)
,它永远不会完成。
对于您的问题,setInterval是理想的:
setInterval(main, 5000)
推荐阅读
- android - 方法解析中的歧义以及如何解决它
- python - 如何在数据框中选择基于列值相似的行
- javascript - 无法访问 this.setState
- networking - 如何从 mininet 中主机的 xterm 获取交换机的 dpid?
- html - 悬停后如何启用下拉菜单?
- c# - Visual Studio 中的 SharePoint 可视化 Webpart 单元测试
- ios - 防止 UICollectionView 在 contentOffset 之外滚动
- typescript - 如何修复 TypeScript 在 localstorage.get 上抛出错误
- extjs - ExtJS 7 Force Froala 编辑器以适应父组件大小
- ios - 我们可以指示 PAServer 执行自定义命令吗?