Kar*_*B25 3 javascript program-entry-point asynchronous node.js puppeteer
目前正在开发一个小型 NodeJS 项目,其中涉及 Puppeteer 库。我遇到的问题是 index.js 中的 main() 函数似乎永远不会退出。所有代码都运行良好,但在 VS code 中看起来程序仍在运行。
下面是一些示例代码:
var UserAgent = require('user-agents');
const userAgent = new UserAgent();
const puppeteer = require('puppeteer-extra');
const StealthPlugin = require('puppeteer-extra-plugin-stealth');
puppeteer.use(StealthPlugin());
class TS {
constructor() {
let page;
}
async init() {
const browser = await puppeteer.launch({ headless: false });
this.page = await browser.newPage();
await this.page.setUserAgent(userAgent.toString());
}
}
async function main(params) {
console.log("Started main..");
const ts = new TS();
await ts.init();
console.log("Ending main..");
}
main().catch(e => console.error(e));;
Run Code Online (Sandbox Code Playgroud)
如果我在 VS code 终端中运行上述代码,输出将显示:
开始主程序..结束主程序..(空行)
该程序现在将无限期地保持在这种状态,直到我按下 ctrl + C。如果我删除等待的 ts.init() 调用,那么它将按预期工作并且我的终端显示
开始 main.. 结束 main.. PS C:\Users\username\Desktop\nodejs-projects\my-project>
谁能解释一下这是怎么回事?
从我所做的所有研究中,我能想到的最好的办法是事件循环存在一些问题,尽管我真的不知道是什么原因造成的。
将 .then() 添加到 main() 中,类似这样可以解决问题
.then(() => {
setTimeout(() => {
process.exit(0);
}, 5000);;
})
Run Code Online (Sandbox Code Playgroud)
这证明了自从调用 setTimeout() 以来,promise 就得到了解决。但是,如果 main 解析并且没有剩余代码可以运行,我很困惑为什么程序在不调用 process.exit() 的情况下不会自动结束。非常感谢一些帮助。
太有趣了。一整天都在寻找解决方案,当我将其发布到 stackoverflow 时,我就找到了它。
找到这个包,它可以帮助指出诸如阻止节点退出的打开连接之类的事情:why-is-node-running
接下来我发现打开的 puppeteer 连接到打开的 chrome 浏览器需要用这样的东西来关闭:
async close() {
await this.browser.close();
}
Run Code Online (Sandbox Code Playgroud)
我没有删除这个问题,而是想发布这个问题,以防其他人有时也遇到同样的头痛。
| 归档时间: |
|
| 查看次数: |
1343 次 |
| 最近记录: |