1

我是函数式编程的新手,我发现了以下 Fluture 函数式编程示例,它似乎为处理数据库查询和后续数据操作提供了一个非常好的示例。然而需要注意的是,在阅读函数式编程概念时,Just/Nothing monad 似乎是处理空值检查的建议方法。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:

如何让 Either Monads 了解异步函数(Promises/Future)

我假设 encaseP 在将 Promise 转换为 Future 的示例中将替换 fromPromise。

4

1 回答 1

0

实际上,Maybe (Nothing | Just) 通常不是您想要处理错误的方式,因为尽管它可以帮助您缩短后续操作并为您提供一个提供默认值的钩子,但它不会告诉您为什么计算可以不完整。

无论是(左 | 右)都为您提供相同的功能,但还允许您访问导致流程采用错误分支的上下文,因为Left它也包含数据,例如错误消息,这对于从错误中恢复、记录或显示有用的消息很有用给用户。

Fluture 给你一个异步的 Either。因为它是异步的,所以您不能直接检索该值(就像您习惯于使用 Promises 一样),但除此之外,它的行为与 Maybe/Either:fork等价于fold. 你会得到短路和更多(比如改变轨道,映射拒绝分支等)。

这里有一个很好的介绍https://dev.to/avaq/fluture-a-functional-alternative-to-promises-21b

于 2021-03-05T23:27:37.167 回答