我还不清楚调用解析器的res()和fulfill()之间的区别?我看到了功能和条款"解决了承诺"并且"兑现承诺"打了很多。
我什么时候应该使用它们?
答案 0 :(得分:17)
您应该使用resolve
。 deferredPromise.resolve(nextPromise)
表示等待deferredPromise
的所有内容现在都会等待nextPromise
。如果nextPromise
根本不是一个承诺,那么它就会变成一个履行的承诺,继续通知任何等待该值的东西。
fulfill
方法是一个坏主意,将被弃用并最终完全消失。在所有有用的情况下,fulfill
在语义上等同于resolve
。存在的唯一理由是deferredPromise.fulfill(value)
比deferredPromise.resolve(value)
更容易让人类解释,因为resolve
被重载以处理nextPromise
和finalValue
。
fulfill
存在的问题是deferredPromise.fulfill(rejectedPromise)
在语义上是矛盾的。
答案 1 :(得分:15)
通常,解决意味着成功或失败。这就是触发then
动作调用的原因。对于任何给定的承诺,它可能恰好发生一次。
履行表示“解决”成功。这将触发then
操作中的成功回调。 “履行”失败的对应方是拒绝。
从不同的角度来看,您可以将特定时间点的任何承诺的状态分类为“未解决”(有时也称为待处理)或“已解决”,并且“已解决”具有“履行”和“拒绝”的子状态。 “已履行”状态的承诺具有值,处于“已拒绝”状态的承诺具有原因。
用于表示这些概念的每个API中的特定方法不同。不幸的是,有许多博客文章和文档混淆了这些术语,特别是当他们的意思是“解决”时使用“fullfill”,反之亦然。
我不太清楚Q,但看起来它的resolve
方法实际上履行了承诺(强调添加):
使用非承诺值调用resolve会导致承诺 使用该值履行。
然而,扭曲的是,您还可以使用承诺调用deferred.resolve
,在这种情况下,第一个承诺或多或少地假定传入承诺的状态。例如,如果传入的promise处于“pending”状态,则promise将采用传递的promise的pending状态。这意味着稍微奇怪的语义,名为resolve
的方法实际上无法解析承诺。