q.js:resolve()和fulfill()之间的区别

时间:2013-08-16 19:03:28

标签: javascript asynchronous promise q

我还不清楚调用解析器的res()和fulfill()之间的区别?我看到了功能和条款"解决了承诺"并且"兑现承诺"打了很多。

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

2 个答案:

答案 0 :(得分:17)

您应该使用resolvedeferredPromise.resolve(nextPromise)表示等待deferredPromise的所有内容现在都会等待nextPromise。如果nextPromise根本不是一个承诺,那么它就会变成一个履行的承诺,继续通知任何等待该值的东西。

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

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

答案 1 :(得分:15)

通常,解决意味着成功或失败。这就是触发then动作调用的原因。对于任何给定的承诺,它可能恰好发生一次。

履行表示“解决”成功。这将触发then操作中的成功回调。 “履行”失败的对应方是拒绝

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

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

Q

我不太清楚Q,但看起来它的resolve方法实际上履行了承诺(强调添加):

  

使用非承诺值调用resolve会导致承诺   使用该值履行

然而,扭曲的是,您还可以使用承诺调用deferred.resolve,在这种情况下,第一个承诺或多或少地假定传入承诺的状态。例如,如果传入的promise处于“pending”状态,则promise将采用传递的promise的pending状态。这意味着稍微奇怪的语义,名为resolve的方法实际上无法解析承诺。