鉴于以下几点:
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>
感觉我在这里遗漏了一些非常明显的东西
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),
)