我是函数式编程的新手,我发现下面的fluture函数式编程示例似乎为处理数据库查询和后续数据操作提供了一个非常好的示例。然而,需要注意的是,在阅读函数式编程概念时,Just/Nothing monad似乎是处理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:
How to make Either Monads be aware of of Async functions(Promises/Future)
我假设在将Promise转换为Future的示例中,encaseP将取代fromPromise。
发布于 2021-03-06 07:27:37
实际上,可能(Nothing | Just)通常不是您想要的错误处理方式,因为尽管它可以帮助您缩短后续操作并为您提供一个提供默认值的钩子,但它不会告诉您计算无法完成的原因。
(Left | Right)为您提供了相同的功能,但也允许您访问导致流程采用错误分支的上下文,因为Left也保存数据,例如错误消息,这对于从错误中恢复、记录日志或向用户显示有用的消息非常有用。
Fluture也为您提供了异步。因为它是异步的,所以您不能直接检索值(就像您在Promises中习惯的那样),但除此之外,它的行为与可能/两者中的任一个相同:fork相当于fold。你会得到短路和更多的东西(比如改变轨迹,映射到reject分支上,等等)。
这里有一个很好的介绍https://dev.to/avaq/fluture-a-functional-alternative-to-promises-21b
https://stackoverflow.com/questions/66497031
复制相似问题