首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Sancuary执行Fluture任务

使用Sancuary执行Fluture任务
EN

Stack Overflow用户
提问于 2019-11-05 15:19:23
回答 1查看 203关注 0票数 0

我有一根这样的烟斗

代码语言:javascript
复制
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作为输入时,我可以更多地派生它。

当我登录pipeResult时,我看到以下内容:

代码语言:javascript
复制
Right (tryP(() => Promise.resolve(x + ' str2')))

我该怎么做呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-05 18:33:18

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都表示失败的计算。

不过,我们可能已经有了一个验证函数,它返回一个或多个。例如:

代码语言:javascript
复制
//    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

代码语言:javascript
复制
S.map (validateEmail) (fut) :: Future String (Either String String)

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

代码语言:javascript
复制
//    eitherToFuture :: Either a b -> Future a b
const eitherToFuture = S.either (Future.reject) (Future.resolve);

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

代码语言:javascript
复制
S.compose (eitherToFuture) (validateEmail) :: String -> Future String String

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

代码语言:javascript
复制
S.map (S.compose (eitherToFuture) (validateEmail)) (fut) :: Future String (Future String String)

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

代码语言:javascript
复制
S.chain (S.compose (eitherToFuture) (validateEmail)) (fut) :: Future String String
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58706276

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档