gpt4 book ai didi

javascript - 使用 Sancuary Either 执行 Fluture 任务

转载 作者:行者123 更新时间:2023-12-01 00:29:14 25 4
gpt4 key购买 nike

我有一个这样的管道

const asyncFn = (x) => {
return Future.tryP(() => Promise.resolve(x + ' str2'))
};

const pipeResult = S.pipe([
x => S.Right(x + " str1"), // some validation function
S.map(asyncFn),
])("X");

pipeResult.fork(console.error, console.log);

我想在asyncFn中执行一些异步操作。问题是当我有 Right 作为输入时,我可以再 fork 它。

当我记录 pipeResult 时,我看到:

Right (tryP(() => Promise.resolve(x + ' str2')))

我该怎么做?

最佳答案

Either a bFuture a b 都能够表达失败/成功。使用异步计算时,通常最好使用 Future a b 而不是 Future a (Either b c)。更简单、更扁平的类型需要更少的映射:S.map (f) 而不是 S.map (S.map (f))。另一个优点是错误值始终位于同一位置,而对于 Future a (Either b c)ab 都表示失败的计算.

不过,我们可能已经有一个返回任一值的验证函数。例如:

//    validateEmail :: String -> Either String String
const validateEmail = s =>
s.includes ('@') ? S.Right (S.trim (s)) : S.Left ('Invalid email address');

如果我们有一个 Future String String 类型的值 fut,我们如何验证 fut 可能包含的电子邮件地址?首先要尝试的始终是 S.map:

S.map (validateEmail) (fut) :: Future String (Either String String)

最好避免这种嵌套。为此,我们首先需要定义一个从 Either a bFuture a b 的函数:

//    eitherToFuture :: Either a b -> Future a b
const eitherToFuture = S.either (Future.reject) (Future.resolve);

我们现在可以将任一返回函数转换为 future 返回函数:

S.compose (eitherToFuture) (validateEmail) :: String -> Future String String

让我们回顾一下 S.map 的使用:

S.map (S.compose (eitherToFuture) (validateEmail)) (fut) :: Future String (Future String String)

我们仍然有嵌套,但现在内部和外部类型都是Future String _。这意味着我们可以用 S.chain 替换 S.map 以避免引入嵌套:

S.chain (S.compose (eitherToFuture) (validateEmail)) (fut) :: Future String String

关于javascript - 使用 Sancuary Either 执行 Fluture 任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58706276/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com