parallel
在管理负载的同时并行化异步操作
1715 bytes
since v12.1.0
使用方法
parallel 函数使用异步回调处理数组。第一个参数控制同时处理多少个数组项目。类似于 Promise.all,返回有序的结果数组。
import * as _ from "radashi";
const userIds = [1, 2, 3, 4, 5, 6, 7, 8, 9];
// 一次运行3个查找用户异步函数// 当3个中的一个释放时开始另一个请求const users = await _.parallel(3, userIds, async (userId) => { return await api.users.find(userId);});从 v12.3.0 开始,如果限制大于数组长度,它将被限制为数组长度。类似地,如果限制小于 1,它将被限制为 1。
中断
从 v12.3.0 开始,处理可以手动中断。通过 signal 选项传递 AbortController.signal。当信号被中止时,不会再调用您的回调。任何正在进行的调用将继续完成,除非您在回调内部手动连接信号。换句话说,parallel 只负责中止数组循环,而不是异步操作本身。
当 parallel 被信号中断时,它会抛出一个 DOMException(即使在 Node.js 中)消息为 This operation was aborted,名称为 AbortError。
import * as _ from "radashi";
const abortController = new AbortController();const signal = abortController.signal;
// 传入信号:const pizzas = await _.parallel( { limit: 2, signal }, ["pepperoni", "cheese", "mushroom"], async (topping) => { return await bakePizzaInWoodFiredOven(topping); // 每个披萨需要10分钟! });
// 稍后,如果您需要中止:abortController.abort();聚合错误
一旦整个数组被处理完成,parallel 将检查错误。如果在处理过程中发生任何错误,它们将被合并成一个 AggregateError。AggregateError 有一个 errors 数组属性,包含所有抛出的单个错误。
import * as _ from "radashi";
const userIds = [1, 2, 3];
const [err, users] = await _.tryit(_.parallel)(3, userIds, async (userId) => { throw new Error(`No, I don\'t want to find user ${userId}`);});
console.log(err); // => AggregateErrorconsole.log(err.errors); // => [Error, Error, Error]console.log(err.errors[1].message); // => "No, I don't want to find user 2"