为什么嵌套在事件回调中的解析函数永远不起作用?

Why a resolve function nested in event callback never works?

我目前正在使用 puppeteer 作为无头浏览器。上下文是,当我登录目标网站时,它会导航到'https://poe.game.qq.com/my-account',所以我使用事件监听器来监听我是否登录成功。这是我的一段代码:

async function newBrowser(name, browsers) {
    /**
    * Start a browser...
    */

    const loginPage = browser.newPage(); 
    await loginPage.goto('some url');
    console.log('Waiting for login...');

    const loginPromise = new Promise( resolve => {
        loginPage.on('load', () => {
            if (loginPage.url()=='https://poe.game.qq.com/my-account') {
                console.log('Login successful.');
                resolve;
            }
        });
    });

    await loginPromise;
}

事实是我的控制台实际打印出“登录成功”。但是 loginPromise 从未得到解决,所以我的函数 newBrowser 始终处于待处理状态。有什么问题吗?

您必须用 resolve(); 实际调用它,而不仅仅是 resolve;。这是一个函数 - 你必须调用它。

而且,你也没有显示你试图查看结果承诺的位置,但你必须等到它解决后才能查看它,因为你试图查看承诺,否则,它仍将悬而未决。请注意,当您的代码命中 await logionPromise 时,newBrowser() 将 return 一个未决的承诺,因此,您不能立即查看 return 来自 newBrowser() 的承诺。相反,您必须执行 await newBrowser()newBrowser().then(...) 才能知道实际履行时间。

嘿,你需要在函数中调用 resolve 回调作为 resolve()

async function newBrowser(name, browsers) {
    /**
    * Start a browser...
    */

    const loginPage = browser.newPage(); 
    await loginPage.goto('some url');
    console.log('Waiting for login...');

    const loginPromise = new Promise( resolve => {
        loginPage.on('load', () => {
            if (loginPage.url()=='https://poe.game.qq.com/my-account') {
                console.log('Login successful.');
                resolve();
            }
        });
    });

    await loginPromise;
}