我是函数式编程的新手,我发现下面的未来函数式编程示例似乎为处理数据库查询和随后的数据操作提供了一个非常好的示例。然而,需要注意的是,在阅读函数式编程概念时,Just/Nothing单子似乎是处理null检查的建议方法。1)它如何适合这个例子? 2)如果findOne被拒绝,它会停止后续链的运行并立即转到分叉吗?
import Future from 'fluture';
const processAll = Future.fork(_sendError, _sendResponse);
const _fetchFromDB =
encaseP(userId => myModel.findOne({ id: userId }).exec())
//Future.fromPromise(userId => myModel.findOne({ id: userId }).exec())
processAll(_fetchFromDB(userId)
.chain(getDataGeneric)
.chain(_findDevice)
.chain(_processRequest))
我从下面的stackoverflow链接中得到了这个例子,并将fromPromise修改为encaseP:
如何让monad意识到Async函数(Promises/Future)
我认为encaseP在将Promise转换为Future的例子中会取代fromPromise。
实际上,Maybe (Nothing | Just)通常不是您想要的错误处理方式,因为尽管它可以帮助您缩短后续操作并为您提供一个钩子来提供默认值,但它不会告诉您计算无法完成的原因。
Either(左|右)给你相同的功能,但也让你访问上下文,导致你的流采取错误分支,因为Left
保存数据,如错误消息,这是有用的从错误中恢复,记录或显示有用的消息给用户。
future给你一个async Either。因为它是异步的,你不能直接检索值(因为你习惯了承诺),但除此之外,它的行为与Maybe/Either相同:fork
相当于fold
。你会得到短路和更多(比如改变轨道,映射到拒绝分支,等等)。
这里有一个很好的介绍https://dev.to/avaq/fluture-a-functional-alternative-to-promises-21b