首页 > 解决方案 > 避免传递临时 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);
    });
}

标签: node.jses6-promisepuppeteer

解决方案


一个等待他们俩的简单 Promise.all 怎么样?

await Promise.all([page.click(), checkForThing()])

这样,无论它们处于哪个顺序,它都会最终解决。


推荐阅读