FT-TS如何压平TaskEither的左侧

问题描述 投票:0回答:1

鉴于以下几点:

OnRequestSuccess
是一个异步函数,它执行一些工作并返回一个字符串
OnRequestFailure
是一个异步函数,它执行一些工作并返回 ERROR

这在某种程度上是期望的流程。我认为我可以使折叠调用 asyncMethods,但随后我只剩下

TaskEither<Promise,Promise>
,我只想要最终类型。


pipe(input,chain(asyncRequestChatMessage), map(asyncOnRequestSuccess), mapLeft(asyncOnRequestFail),foldW(toTask,toTask), finalCall)

在链的末尾,我想获取从其中一个(因此任务)输出的任何内容,并用它调用另一个异步函数。

我的问题是,由于 OnError 和 OnRequest 都是异步的,我似乎无法让它们在流程内解析。我们如何做到这一点?

示例代码:


    const success = (result: string) => TE.tryCatch(() => onRequestSuccess(result), E.toError);
    const fail = (result: Error) => TE.tryCatch(() => onRequestFail(result), E.toError);


 // This is the problem

    const result = pipe(input, TE.right, TE.chain(requestChatMessage), TE.map(success), TE.mapLeft(fail), TE.flattenW);



FlattenW
解决了右侧的问题,但是没有
flattenLeftW
,我也无法让
orElse
工作。

在上面的示例中,我如何才能在结束时获得两种类型(onRequestSuccess 和 OnRequestFail)的任务,然后将其链接到另一个调用中?

或者我怎样才能压平 TaskEither 的左侧,因为现在它会返回

const result: TE.TaskEither<Error | TE.TaskEither<Error, Error>, string>

感觉我在这里遗漏了一些非常明显的东西

javascript typescript functional-programming fp-ts
1个回答
0
投票

orElse 应该做你想做的事,即充当 chainLeft。

例如,使用人为的类型:

type R = () => TE.TaskEither<'FAILURE', 'SUCCESS'>    
const success: R = () => TE.right('SUCCESS')
const failure: R = () => TE.left('FAILURE')
const requestChatMessage: R = () => TE.right('SUCCESS')

const result: TE.TaskEither<'FAILURE', 'SUCCESS'> = pipe(
    0, 
    TE.right, 
    TE.chain(requestChatMessage), 
    TE.chain(success),
    TE.orElse(failure),
)
© www.soinside.com 2019 - 2024. All rights reserved.