typescript - 并行运行一组 TaskEithers,但如果 1 个或多个任务失败则继续

标签 typescript functional-programming fp-ts

我必须并行进行一系列 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.taskEithersequence/sequenceT ( docs ):

Action: execute an array of tasks in parallel, collecting all failures and successes

TaskEither: array.sequence(T.task)(taskEithers) - same for 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>
这里是沙箱 mergeFn实现:sequence , sequenceT .

关于typescript - 并行运行一组 TaskEithers,但如果 1 个或多个任务失败则继续,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60471399/

相关文章:

javascript - 如何使 webpack typescript react webpack-dev-server 配置以自动构建和重新加载页面

typescript - 解决 Array<T> 和 IObservableArray<T> 不兼容性问题

javascript - Typescript:放大或缩小接收对象?

function - 为什么我的过程的参数出现 'not a function' 错误?

typescript :如何 kleisli compose (monadic compose) Promise monad using fp-ts

typescript - 在 fp-ts 中,如何组合 2 个(或更多)Ord 实例

angular - 退订一系列订阅

javascript - JavaScript 中的函数式数据类型

haskell : error while chaining function using monad

fp-ts 返回从任一 [] 序列的所有左值