为什么Puppeteer事件回调中嵌套的resolve函数始终无法生效?
问题原因
- 核心错误:你没有调用Promise的
resolve函数。代码中写的resolve;只是引用了这个函数对象,并没有执行它,所以Promise永远不会进入fulfilled状态,导致await一直处于等待状态。 - 次要错误:
browser.newPage()是异步方法,你没有加await关键字,后续对loginPage的操作可能出现未定义异常。
修复后的代码
async function newBrowser(name, browsers) { /** * 启动浏览器逻辑省略 */ // 补全await关键字 const loginPage = await browser.newPage(); await loginPage.goto('some url'); console.log('等待登录完成...'); const loginPromise = new Promise( resolve => { // 抽离监听逻辑为单独函数,方便后续移除监听避免内存泄漏 const handlePageLoad = () => { if (loginPage.url() === 'https://poe.game.qq.com/my-account') { console.log('登录成功'); // 调用resolve函数,可根据业务需要传入返回值 resolve(); // 触发完成后移除监听,避免重复执行 loginPage.off('load', handlePageLoad); } } loginPage.on('load', handlePageLoad); }); await loginPromise; }
补充优化建议
- 可以给Promise添加超时逻辑,避免登录失败、跳转异常时函数永远挂起
- URL匹配建议用
includes或者正则规则,避免跳转后URL带查询参数、hash时匹配失败
内容的提问来源于stack exchange,提问作者Vector
相关产品推荐
相关产品推荐

