【发布时间】:2020-12-01 06:19:29
【问题描述】:
我试图通过使用 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
})
}
我在这里做错了什么?
【问题讨论】:
-
没有什么 main 对 while 循环是否继续有任何交互作用。因此,无论 main 是否完成了它需要做的事情,while 循环都会继续,直到它被硬停止。
-
温馨提示:您的代码表明您还没有完全理解 JS 中的异步基础知识。另外,您通常不会混合使用
await和then(...)(通常,您应该尽可能始终使用await)。 MDN 是学习 JS'concurrency model、Promise 和 await 基础知识的好地方。
标签: node.js asynchronous while-loop async-await