使用 Sancuary 执行 Fluture 任务
execute Fluture task with Sancuary Either
我有一个这样的烟斗
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
时,我看到了这个:
Right (tryP(() => Promise.resolve(x + ' str2')))
我该怎么做?
Either a b
和Future a b
都可以表达failure/success。在处理异步计算时,通常最好使用 Future a b
而不是 Future a (Either b c)
。更简单、更扁平的类型需要更少的映射:S.map (f)
而不是 S.map (S.map (f))
。另一个优点是错误值总是在同一个地方,而 Future a (Either b c)
a
和 b
都表示计算失败。
不过,我们可能已经有了一个 returns 的验证函数。例如:
// validateEmail :: String -> Either String String
const validateEmail = s =>
s.includes ('@') ? S.Right (S.trim (s)) : S.Left ('Invalid email address');
如果我们有一个 fut
类型的值 Future String String
,我们如何验证 fut
可能包含的电子邮件地址?首先要尝试的总是 S.map
:
S.map (validateEmail) (fut) :: Future String (Either String String)
最好避免这种嵌套。为此,我们首先需要定义一个从 Either a b
到 Future a b
:
的函数
// eitherToFuture :: Either a b -> Future a b
const eitherToFuture = S.either (Future.reject) (Future.resolve);
我们现在可以将任一返回函数转换为未来返回函数:
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
我有一个这样的烟斗
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
时,我看到了这个:
Right (tryP(() => Promise.resolve(x + ' str2')))
我该怎么做?
Either a b
和Future a b
都可以表达failure/success。在处理异步计算时,通常最好使用 Future a b
而不是 Future a (Either b c)
。更简单、更扁平的类型需要更少的映射:S.map (f)
而不是 S.map (S.map (f))
。另一个优点是错误值总是在同一个地方,而 Future a (Either b c)
a
和 b
都表示计算失败。
不过,我们可能已经有了一个 returns 的验证函数。例如:
// validateEmail :: String -> Either String String
const validateEmail = s =>
s.includes ('@') ? S.Right (S.trim (s)) : S.Left ('Invalid email address');
如果我们有一个 fut
类型的值 Future String String
,我们如何验证 fut
可能包含的电子邮件地址?首先要尝试的总是 S.map
:
S.map (validateEmail) (fut) :: Future String (Either String String)
最好避免这种嵌套。为此,我们首先需要定义一个从 Either a b
到 Future a b
:
// eitherToFuture :: Either a b -> Future a b
const eitherToFuture = S.either (Future.reject) (Future.resolve);
我们现在可以将任一返回函数转换为未来返回函数:
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