node.js - 避免传递临时 Promise 对象
问题描述
我正在使用 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);
});
}
解决方案
一个等待他们俩的简单 Promise.all 怎么样?
await Promise.all([page.click(), checkForThing()])
这样,无论它们处于哪个顺序,它都会最终解决。
推荐阅读
- tensorflow - 如何从视频数据集制作数据集(首先是tensorflow)
- c++ - 为什么我的控制台程序可以连接g29车轮,但无法读取车轮数据?
- android - 协程中的异步函数在 Android 上不起作用
- sql - SQL - 检查是否在另一个表中找到唯一值
- regex - 使用 Google RE2 Regexp for Data Studio 从 URL 中提取域名
- macos - 无法在 Mac 上的系统启动时运行 shell 脚本?
- tensorflow - 我应该使用哪种 TensorFlow 来预测某人是否会喜欢某个地方?
- jenkins - Jenkins 定期构建表达式“*/40 * * * *”未按预期工作
- python - 安装包后Python中的请求不起作用
- cloud-foundry - 如何轻松地从带有目的地的 html5 应用程序中使用 nodejs-backend?