typescript - 并行运行一组 TaskEithers,但如果 1 个或多个任务失败则继续
问题描述
我必须并行进行一系列 IO 调用,如果成功则合并调用的内容。如果一个失败,其他人将按正常方式处理,但会出现错误消息。
我对如何实现这一点的思考过程:
Array<TE<E, A>> -> TE<E, Array<A>> -> TE<E, MergedA> -> [E, A]
我目前在做什么:
我目前正在对一组 TE 进行排序,但链中的任何故障都会产生左侧。
pipe(
sequenceT(TE.taskEither)(arrayofTE), //TE<E,A>[] -> TE<E,A[]>
TE.map(mergeFn), //TE<E, A[]> -> TE<E, MergedA>
???
)
如何停止短路?
解决方案
您可以传递T.task
而不是传递TE.taskEither
给sequence
/ sequenceT
(文档):
动作:并行执行一系列任务,收集所有失败和成功
TaskEither: array.sequence(T.task)(taskEithers) - 与sequenceT相同
sequence
: 并行运行相同类型的任务
import { pipeable as P, taskEither as TE, task as T, array as A, either as E } from "fp-ts";
const arrayofTE: TE.TaskEither<string, number>[] = [
TE.right(1),
TE.right(2),
TE.left("Oh shit")
];
const run = P.pipe(
// change to T.task instead of TE.taskEither here
A.array.sequence(T.task)(arrayofTE),
mergeFn
);
run(); // run side effect
// returns Promise<{"errors":["Oh shit"],"results":[1,2]}>
// whatever merged result you want to have; this one collects all errors and all results
declare function mergeFn(te: T.Task<E.Either<string, number>[]>): T.Task<Results>
type Results = { errors: string[]; results: number[] };
sequenceT
: 并行运行不同类型的任务
import { apply as AP /* and others above */ } from "fp-ts";
// Here, TaskEither result can be number | boolean (success case), string on error
const arrayofTE = [TE.right(1), TE.right(true), TE.left("Oh shit")] as const;
const run = P.pipe(
AP.sequenceT(T.task)(...arrayofTE), // we use sequenceT here and pass T.task again
mergeFn
);
declare function mergeFn(a: T.Task<E.Either<string, number | boolean>[]>): T.Task<Results>
推荐阅读
- flutter - Flutter Bloc 事件未按正确顺序发生
- java - 在 Java Spark Job 中使用 avro 模式 (avsc) 将 avro 数据写入 s3
- spring - spring-security-oauth2-autoconfigure - 无效令牌:从 2.1.5 版到 2.3.1 版的变化
- azure - 天蓝色cli | mkdir: 无法创建目录 | 没有权限
- html - HTML5 日期输入 - 支持部分 ISO8601 字符串?
- c - 从链表中删除项目
- java - 递归地最小化塔之间的最大差异
- listview - 根据 xamarin 中的 api 响应在列表视图中填充数据
- javascript - window.removeEventListener 在 componentWillUnmount 上不起作用
- python - 在 Pandas、int 和 str 中创建新列时遇到问题