15

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

我应该什么时候使用每个?

4

2 回答 2

17

你应该使用resolve. deferredPromise.resolve(nextPromise)意味着任何等待的东西deferredPromise现在都会等待nextPromise。如果nextPromise根本不是一个承诺,它就会变成一个已履行的承诺,继续通知任何等待它的东西该值已经可用。

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

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

于 2013-08-27T15:09:33.420 回答
15

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

完成意味着成功地“解决” 。这将触发then操作中的成功回调。失败的“完成”对应的是拒绝

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

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

我不是很了解Q,但看起来它的resolve方法实际上实现了承诺(强调添加):

使用 non-promise 值调用 resolve 会导致 promise 用该值实现

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

于 2013-08-18T02:39:22.910 回答