What I do:个
我爬网,我这样做的方式是,我有一个网站链接列表,并从每个创建一个promise (promise 基本上是一个爬虫).我这样做的顺序,例如,如果我有10个链接,我会爬第一个链接,等待它完成,爬第二个链接,等等.
What I need:个
我想要实现的是将我的promise 组合在一起.每个组将并行运行,但组列表将按顺序运行.
例如,我有10个链接,我将从它们中创建10个promise . 在那之后,我会把promise 分成小组,每组最多3个promise . 之后应该先爬行3(因为他们是第一组),等待他们完成,然后运行第4,5,6,因为他们是第二组,等等.
What I tried:个
我创造了一种拆分promise 的方法:
export function splitPromises<T>(promises: Promise<T>[], maxPerItem: number): Promise<T>[][] {
const splitPromisesList: Promise<T>[][] = [];
let currentSplit: Promise<T>[] = [];
for (let i = 0; i < promises.length; i++) {
currentSplit.push(promises[i]);
if (currentSplit.length === maxPerItem || i === promises.length - 1) {
splitPromisesList.push(currentSplit);
currentSplit = [];
}
}
return splitPromisesList;
}
在使用拆分和调用promise 的方法之后:
async function crawler(links: string[], page: Page): Promise<MyData[]> {
const list: MyData[] = [];
const crawlPromises = links.map(async (link, index) => {
try {
const newPage = await page.browser().newPage();
const detail = await crawlLink(link, newPage);
await newPage.close();
return detail;
} catch (e) {
console.log(e);
return null as MyData;
}
});
const groupedPromises = splitPromises<MyData>(crawlPromises, 3);
let results: MyData[] = [];
for (const group of groupedPromises) {
results = await Promise.all(group);
const filteredResults: MyData[] = results.filter((detail) => detail !== null) as MyData[];
list.push(...filteredResults);
}
return list;
}
What are my issues:个 我不确定我做错了什么,但它一次执行所有promise ,而不是按组执行.