我正在使用puppeteer自动执行chrome,我发现自己经常执行以下操作
// set up a promise that will resolve once some specific
// network response (xhr for example) shows up
const eventPromise = checkForThing();
await page.click(SUBMIT_BUTTON);
await eventPromise;
下订单的原因是,我不想错过由于页面点击而发生的网络响应。
有更好的方法吗?因此,我不想在各处临时承诺对象。理想情况下,代码应该只是阅读
await page.click()
await checkForThing();
checkForThing()
看起来像
function checkForThing(page) {
return new Promise((resolve, reject) => {
function handleLoginResponse(response) {
try {
if (response.resourceType() === 'xhr') {
return;
}
const request = response.request();
if (response && response.status() === 401) {
reject(loginFailureMessage);
} else {
resolve();
}
page.off('response', handleLoginResponse);
} catch (error) {
reject(loginFailureMessage);
}
};
page.on('response', handleLoginResponse);
});
}
答案 0 :(得分:1)
一个等待他们的简单Promise.all怎么样?
await Promise.all([page.click(), checkForThing()])
通过这种方式,无论它们处于哪个顺序,它都将最终解决。