【发布时间】:2021-02-24 15:42:14
【问题描述】:
所以我正在使用puppeteer,我只是在多个选项卡中并行抓取页面,并使用我使用的 for 循环的相同 URL 打开多个选项卡,如下所示:
const startScraping = async (url) => {
for (let i of MyArray) {
const page = await browser.newPage();
page.goto(url).then(() => {
scrapePage(page); // This is the function where I am scraping through this page. and
// This is also a async function
});
}
return new Promise((resolve, reject) => {
resolve("Done");
reject("Error");
});
}
startScraping(url).then((data) => {
console.log(data);
})
但问题是在循环之后立即返回承诺,但我想要的是应该在所有页面都抓取之后返回这个promise。
谁能帮帮我?
PS: scrapePage() is also a async function
提前致谢。
仅用于解释场景:
async function func() {
setTimeout(() => {
return "Done";
}, 3000);
}
async function scrapeSingle(url) {
return [url, await func()];
}
let myArray = [1, 2, 3, 4, 5];
const parallelScrapes = myArray.map((url) => scrapeSingle(url));
Promise.all(parallelScrapes).then((data) => {
console.log(data);
});
在这里,我想在 3 秒后打印 [[1, "Done"], [2, "Done"], [3, "Done"], [4, "Done"], [5, "Done"]],但它正在立即打印 [[ 1, undefined ], [ 2, undefined ], [ 3, undefined ], [ 4, undefined ], [ 5, undefined ]]。
【问题讨论】:
标签: javascript promise async-await puppeteer es6-promise