Him*_*mad 3 javascript ajax node.js puppeteer
特定事件发生后,如何继续使用我的 puppeteer 代码?以一种同步的方式。例如,我有以下“请求”事件代码:
await page.on('request', request => {
if (request.resourceType() === 'xhr'){
//do something
}
});
Run Code Online (Sandbox Code Playgroud)
我的 puppeteer 代码依赖于特定页面上的 AJAX 调用响应来填写表单。因此,我想我必须以某种方式创建请求事件函数,以便在满足条件时解析承诺,以便在代码中稍后将其用作参考,但我希望获得有关该主题的一些指导,因为我不太熟悉使用异步代码,也不使用 Promise 或 puppeteer。谢谢!
page.on('request')你可以在进入页面之前封装 Promise 并等待这个 Promise 被解析,如下所示:
const observedXhr = new Promise(resolve =>
page.on('request', request => {
if (request.resourceType() === "xhr") {
resolve();
}
request.continue();
})
);
// later in the code
await observedXhr;
// rest of the program after xhr is compleated
Run Code Online (Sandbox Code Playgroud)
这是完整的示例:
const puppeteer = require('puppeteer');
const html = `
<html>
<body>
<script>
fetch('https://swapi.co/api/people/1/');
</script>
</body>
</html>`;
(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.setRequestInterception(true);
const observedXhr = new Promise(resolve =>
page.on('request', request => {
if (request.resourceType() === "xhr") {
resolve();
}
request.continue();
})
);
await page.goto(`data:text/html,${html}`);
console.log('before xhr');
// await for resolved promise
await observedXhr;
console.log('after xhr');
await browser.close();
})();
Run Code Online (Sandbox Code Playgroud)
这个问题扩展了你的问题——它对你来说很有价值。