如何解决通过for循环调用的所有异步函数完成后,如何进行平滑处理?
所以我正在与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,但是我想要的是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,[3,[4,[5,"Done"]]
,但是它正在立即打印[[ 1,undefined ],[ 2,[ 3,[ 4,[ 5,undefined ]]
。
解决方法
您正在混合和匹配async
和then
甚至new Promise()
。
串行解决方案应该是
const startScraping = async (url) => {
const data = [];
for (let i of MyArray) {
const page = await browser.newPage();
await page.goto(url);
const result = await scrapePage(page);
data.push([i,result]);
}
return data;
};
startScraping(url).then((data) => {
console.log(data);
});
要并行执行myArray
中的所有网址,您需要使用Promise.all()
:
async function scrapeSingle(browser,url) {
const page = await browser.newPage();
await page.goto(url);
return [url,await scrapePage(page)];
}
const parallelScrapes = myArray.map((url) =>
scrapeSingle(browser,url),);
Promise.all(parallelScrapes).then((data) => {
console.log(data);
});
,
这行得通。
const startScraping = async (url) => {
let tasks = [];
for (let i of MyArray) {
const page = await browser.newPage();
await page.goto(url);
tasks.push(scrapePage(page))
}
await Promise.all(tasks);
return new Promise((resolve,reject) => {
resolve("Done");
reject("Error");
});
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。