【问题标题】:q.js: difference between resolve() and fulfill()q.js:resolve() 和fill() 之间的区别
【发布时间】:2013-08-27 23:09:33
【问题描述】:

我仍然不清楚调用解析器的resolve() 与fulfill() 之间的区别?我看到函数和术语“解决一个承诺”和“履行一个承诺”都被反复提及。

我应该什么时候使用它们?

【问题讨论】:

标签: javascript asynchronous promise q


【解决方案1】:

您应该使用resolve。 deferredPromise.resolve(nextPromise) 意味着任何等待deferredPromise 的东西现在都将等待nextPromise。如果nextPromise 根本不是一个promise,它就会变成一个已经实现的promise,然后通知任何等待它的东西该值已经可用。

fulfill 方法是一个坏主意,将被弃用并最终完全消失。在所有有用的情况下,fulfill 在语义上等同于resolve。存在的唯一原因是 deferredPromise.fulfill(value) 比 deferredPromise.resolve(value) 更易于人类解释,因为 resolve 被重载以处理 nextPromise 和 finalValue。

fulfill 存在的问题在于deferredPromise.fulfill(rejectedPromise) 在语义上是矛盾的。

【讨论】:

  • ……除非我们允许嵌套的 Promise - 语义纯 :-)
  • @Bergi,对此进行了很多讨论,但resolve 不需要更改。有人谈到将强制转换为 then(和其他),并使用 flatMap 来解开严格的单子承诺。
【解决方案2】:

一般来说,resolve意味着要么成功要么失败。这就是触发then 动作调用的原因。对于任何给定的 Promise,它只能发生一次。

fulfill 表示“解决”成功。这将触发then 操作中的成功回调。失败的“完成”对应的是reject。

从不同的角度来看,您可以将任何承诺在特定时间点的状态分类为“未解决”(有时也称为待处理)或“已解决”,而“已解决”具有“完成”和“拒绝”的子状态。处于“已履行”状态的承诺具有价值,处于“已拒绝”状态的承诺具有原因。

每个 API 中用于表示这些概念的特定方法不同。不幸的是,有许多博客文章和文档混淆了这些术语,尤其是当它们表示“解决”时使用“fullfill”,反之亦然。

问

我不太了解 Q,但它的 resolve 方法似乎实际上履行承诺(强调):

使用非承诺值调用解析会导致承诺 满足该值。

然而,不同的是,您也可以使用 Promise 调用 deferred.resolve,在这种情况下,第一个 Promise 或多或少假定了传入 Promise 的状态。例如,如果传入的 Promise 处于“待处理”状态,则该 Promise 将采用传递的 Promise 的待处理状态。这意味着一个名为 resolve 的方法实际上并没有解决这个承诺的语义有点奇怪。

【讨论】:

  • 我喜欢你的解释。你是对的,不同的 API 实现为resolve 和fulfill 选择不同的含义真的很令人困惑。
猜你喜欢
  • 2016-05-03
  • 1970-01-01
  • 1970-01-01
  • 2021-12-25
  • 2020-05-10
  • 2014-09-20
  • 2010-10-28
  • 2015-10-04
相关资源
最近更新 更多