我正在使用Bluebird做异步操作,但现在必须做很多空/空/错误检查,我不想按照通常的Else路线.我正在考虑使用monad,但尚未彻底完成它.
此外,我希望它能与ramda一起使用,pipe / compose
因为我的大多数其他代码都整齐地封装在功能管道中.根据许多 讨论,monadic Futures(Fluture似乎被推荐)比Promises更受欢迎,对pipeP的支持和composeP可能在未来版本中被删除.
Fluture似乎是一个不错的选择,因为据说它可以很好地适应那些坚持幻想 - 土地规格的图书馆(如ramda).
但是我完全迷失了如何实现将Ramda的管道与Fluture集成在一起的东西.我需要一些示例代码的帮助.
例如:
我有一个DB调用,返回一个对象数组.数组可能具有值,为空或未定义.我有一个功能管道,可以转换数据并将其返回到前端.
示例承诺代码:
fancyDBCall1(constraints)
.then(data => {
if (!data || data.length === 0) {
return []
}
return pipe(
...
transformation functions
...
)(data)
})
.then(res.ok)
.catch(res.serverError)
Run Code Online (Sandbox Code Playgroud)
有人可以就一个好的方法提出一些指示.
我有一个这样的管道:
S.pipe([
getRequestFile, // not async
S.chain(saveTemporary), // not async
S.chain(copyImageToPublicPath), // async
S.chain(copyFileToPath), // async
S.chain(someLoggingFunction), // not async
S.chain(sendResponse), // not async
]);
Run Code Online (Sandbox Code Playgroud)
在这个管道中间有 2 个异步函数。我要await
forcopyImageToPublicPath
然后await
forcopyFileToPath
然后继续正常流程
经过一番搜索,我发现有Future.tryP
功能可以做,async
但是我如何Fluture
在这个管道中间使用?
我有一个这样的管子
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);
Run Code Online (Sandbox Code Playgroud)
我想在asyncFn
. 问题是当我有Right
输入时,我可以再分叉它。
当我登录时,pipeResult
我看到:
Right (tryP(() => Promise.resolve(x + ' str2')))
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?