Deno中能否将两个pooledMap返回的异步迭代对象合并?
问题原因
pooledMap返回的是异步可迭代对象,并非普通数组,所以无法使用Array.concat方法合并。
解决方案
方案1:并行合并(推荐)
用Deno标准库内置的mergeAsyncIterables工具合并,两个池的任务会并行执行,哪边先返回结果就先处理哪边,性能更高:
// 导入工具 import { mergeAsyncIterables } from "https://deno.land/std@0.208.0/async/merge.ts"; // 合并两个异步迭代池 const mergedPool = mergeAsyncIterables(pool, pool2); // 遍历逻辑和你之前单池的写法完全兼容 const results = []; for await (const data of mergedPool) { console.log('data: ', data); console.log('found links: ', data?.links?.length); // 加空数组兜底避免data.links为空时报错 for (const link of data?.links ?? []) { const url = link.trim(); results.push(url); } }
合并后两个池的并发限制各自独立,原配置每个池20并发,合并后总并发最高为40,可根据需求自行调整pooledMap的第一个参数。
方案2:串行合并(无需额外依赖)
如果不需要并行执行,想要先跑完第一个池的所有任务再跑第二个池,可以自己实现简易的合并函数:
// 串行合并异步迭代器的生成器函数 async function* concatAsyncIters(...iters) { for (const iter of iters) { yield* iter; } } // 合并两个池 const mergedPool = concatAsyncIters(pool, pool2); // 后续遍历逻辑和方案1完全一致
内容的提问来源于stack exchange,提问作者chovy
相关产品推荐
相关产品推荐

