【问题标题】:What is Folktale's Future for?民间故事的未来是为了什么?
【发布时间】:2018-12-19 02:14:46
【问题描述】:

背景

我正在阅读每一寸文档,并尽可能多地了解 Folktale。 最近决定试试Future

我们需要未来吗?

虽然我现在了解TaskPromise 之间以及TaskFuture 之间的区别(支持取消),但我不清楚FuturePromise 之间的区别。

我为什么要使用 Future 而不是 Promise ?我会有什么好处? 好吧,你可以说:“这样你实际上有一个 monad,而不是一个 monad 的抱歉借口”。

这本身就是一个很好的论点,但是......记住我总是需要从 Promise 转换为其他东西(到未来)并且Future 的 API 几乎相同,它是作为一个新人,我不清楚为什么我应该关心Future

代码示例

假设我有这个函数,其中request 是一个发出请求并返回一些结果的函数。

extractRequestInfo 是一个从响应对象中提取数据的函数。 如果发生故障,我会catch 错误并返回一个包含所有数据、badId 和错误的对象。

const requestFruit = request => data =>
    request( data )
        .then( extractRequestInfo )
        .catch( error => ( { badId: prop( [ "Id" ], data ), error } ) );

鉴于这是一个 HTTP 请求,我知道我不需要 Task,因为我无法在此处执行取消操作。所以我的选择是PromiseFuture

问题

  1. 如何在此示例中使用 Future
  2. 既然这可能会失败,我是否也应该使用Result

【问题讨论】:

    标签: javascript functional-programming folktale


    【解决方案1】:

    引用创建者 Quil 的回复:

    Future 解决了与 Promise 相同的问题,因此没有太多的 两者的概念差异。不同之处在于如何 他们解决了问题。

    Promise 可以成功或失败。在任何转变中 你申请一个承诺的价值,同步抛出的错误将是 隐含地捕获并拒绝承诺。这很有趣 在 async/await 中,因为您可以处理这些错误(同步和 异步)以类似的方式——你不需要提升每个 同步操作变成一个承诺,因为运行时会这样做 给你。

    这样做的缺点是很容易发现您遇到的错误 不打算,并且让您的系统在不一致的状态下运行。一世 不要认为你可以在这里做很多静态分析。

    期货没有这个问题,因为没有任何东西被提升到 隐含的未来。如果您希望同步操作使用 未来处理错误的管道,你必须把它们放在那里 明确地。这使您可以更好地控制错误处理,并且 未捕获的错误仍会按预期使进程崩溃(避免 让您的程序在您的情况下运行到不一致的内存状态 没预料到),但是这样写程序更费劲。

    除此之外,如果您考虑 Tasks,Futures 建模最终 具有成功案例、失败案例和 取消案例。 Promises 只有成功案例和失败案例 情况,所以取消被建模为一个特殊的失败值。这 稍微改变了处理取消的习惯用法。这是可能的 使用 Promise 处理失败的代码,而无需意识到这一点 特殊的取消值,这可能是一个问题,因为这个值 在这些转换过程中很容易丢失。

    在混合了承诺和任务的代码库中,这些问题更多 复杂,因为 promise 所做的隐式提升错误是 与错误的显式调整不太兼容 任务/期货期望(这可能导致像这样的问题:#163)。 发现这些错误比你只有承诺要困难得多 或只有任务/未来。不确定处理这些问题的最佳方法是什么 还没有案例。

    对于原始讨论:

    https://github.com/origamitower/folktale/issues/200

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-25
      • 2014-08-16
      • 2018-11-11
      • 2019-06-01
      • 2014-09-10
      • 2015-12-15
      • 2015-05-31
      • 2015-02-23
      相关资源
      最近更新 更多