为什么嵌套在事件回调中的解析函数永远不起作用?
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;
}
我目前正在使用 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;
}