【问题标题】:Fluture: how should null handling get addressed using MonadsFluture:如何使用 Monads 解决空处理问题
【发布时间】:2021-06-04 09:34:26
【问题描述】:

我是函数式编程的新手,我发现了以下 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:

How to make Either Monads be aware of of Async functions(Promises/Future)

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

【问题讨论】:

    标签: javascript node.js functional-programming monads fluture


    【解决方案1】:

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

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

    Fluture 为您提供异步的 Either。因为它是异步的,所以你不能直接检索值(就像你习惯于使用 Promises 一样),但除此之外,它的行为与 Maybe/Either 相同:fork 等同于 fold。您会遇到短路以及更多情况(例如更改轨道、映射拒绝分支等)。

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

    【讨论】:

    • 那么,Either 让您能够在管道中使用 await/async?
    • 如果您想将 Future 计算作为 Promise 运行并能够 await 它,您可以使用帮助器 promise 而不是 fork,但随后您失去了取消它的能力并且异常将与拒绝分支混合在一起,因此最佳实践是尽可能使用 Fluture 的许多铁路编程功能,如果需要,可以在程序的最边缘将计算作为 Promise 运行。无论如何,你不能嵌套 Promise 和 Futures,因为 Promise 是渴望的,而 Futures 是惰性的:当你使用 Fluture 时,你写的一切都是一厢情愿,直到你分叉。
    猜你喜欢
    • 1970-01-01
    • 2021-12-19
    • 1970-01-01
    • 2016-02-04
    • 2018-08-31
    • 1970-01-01
    • 2019-08-31
    • 2021-12-03
    • 1970-01-01
    相关资源
    最近更新 更多