javascript 承诺的正确术语是什么

What is the correct terminology for javascript promises

我对各种不同的术语感到困惑。据我了解,承诺可以是:

fulfilled
rejected
pending 
settled
resolved
defer

resolve 是指解决了吗?或者这是否意味着它已实现?延迟到底是什么?

section 2.1 of the Promises/A+ specification 中列出了三种承诺状态。

来自规范:

下面是您询问的每个术语:

Pending是初始的promise状态。 promise 代表的操作还没有被 filfilled 或 rejected。

Fulfilled 是三种承诺状态中的另一种。这意味着 promise 已经解决并且现在有它的 resolved 值。 promise代表的操作已经成功完成。

Rejected 是三种承诺状态中的另一种。这意味着承诺已被拒绝,现在有被拒绝的原因。 promise表示的操作取值失败,有取值失败的原因(一般是错误码或错误对象,但可以是任何东西)

Settled 是一个术语,表示承诺要么被履行,要么被拒绝(例如,它不再处于待定状态),但它不是一个单独的状态,只是一个描述性术语来表明它不再处于待定状态。

Resolved是一个经常用来表示与fulfilled相同的术语,但两者并不完全相同。一个承诺可以用一个导致实现的值来解决,或者可以用一个被拒绝的承诺来解决(这会导致拒绝这个承诺)或者它可以用一个未决的承诺来解决(这意味着它现在将等待最终的其他承诺的状态)。

很难说出 延迟 的确切含义。 Promise 通常被归类为 deferred 对象,因为它们是表示延迟到未来(它将在未来发生)的动作和结果的对象。在一些 promises 实现中,实际上有两种类型的对象,一种是 deferred 对象,一种是 promise 对象。延迟对象是承诺对象的超集。两者都可以使用 .then() 处理程序观察何时解决或拒绝操作。但是,只有 deferred 对象才能真正将状态更改为 resolvedrejected

在 jQuery 中,您可以使用 $.Deferred() 创建延迟对象。在 ES6 promises 等其他实现中,您只有带有构造函数回调的 promise 对象,该回调函数具有 rejectresolve 函数。世界大概正在朝着 ES6 的方向发展。

jQuery 使用 deferred 对象的示例:

function delay(t) {
    var defer = $.Deferred();
    setTimeout(function() {
        defer.resolve();
    }, t);
    return defer.promise()
 }

 delay(200).then(function() {
     // run my delayed function now
     doMyThing();
 });

ES6 承诺示例:

 function delay(t) {
     return new Promise(function(resolve, reject) {
         setTimeout(function() {
             resolve();
         }, t);
     });
 }

 delay(200).then(function() {
     // run my delayed function now
     doMyThing();
 });

术语可能很难。
让我们从 Promises/A+ specification and the respective ES6 section 中得出有 3 个状态 :

  • pending - promise 还没有取值,它的未来仍然不确定。
  • fulfilled - promise 成功获得了 result value "assigned"
  • rejected - promise 给出了一个 原因 为什么无法获得结果,通常是一个错误。

术语 已解决 是 fulfilled 和 rejected 的同义词,意思是 either - 与 pending 相反。

动态动词 fulfillreject 描述将状态从 pending 更改为 fulfilled 或 rejected。这些转换称为承诺的履行拒绝

那些很简单。现在,resolve 是一个不同的野兽。它有时被用作 "fulfill" 的同义词,但最好将其理解为将承诺的命运确定为已实现或已拒绝。 promise 的 resolution(很少:settlement)意味着它离开了 pending 状态。但即使这样也不准确——问题在于 Promise 解决程序:

的递归性质
  • 解决具有 "plain" 值的承诺意味着实现它
  • 用承诺(或 thenable)解决承诺意味着采用其状态:

    • 以兑现的承诺解决是一种实现
    • 以拒绝的承诺解决就是拒绝
    • 解决未决承诺意味着等待其解决

是的,如果一个承诺被解决,它甚至可能不知道它是会被履行还是被拒绝。但这意味着命运不再是未定的,因为它绑定到我们解决的承诺(注意你只能解决一次承诺).

忽略这种特殊情况,resolved 承诺通常意味着已确定的承诺。

或者,引用 ECMAScript 6 Specification

A promise is resolved if it is settled or if it has been “locked in” to match the state of another promise. Attempting to resolve or reject a resolved promise has no effect. A promise is unresolved if it is not resolved. An unresolved promise is always in the pending state. A resolved promise may be pending, fulfilled or rejected.


and what the heck is defer?

延迟 结果意味着您 return 对结果的(异步)承诺,而不是直接(同步)结果。还有 return 延期拒绝 instead of throwing synchronously.

请注意,“defer”也用于一些库中(Q) as the method name to construct a Deferred object - see this answer on The differences between Deferred, Promise and Future 有一个很好的解释。
哦,永远不要相信变量名:defer 也可能是缩写的 "deferredObject"。

Domenic Denicola 的“States and Fates”是一个精辟的总结。

状态:

  • 如果 promise.then(f) 将调用 f "as soon as possible"
  • ,承诺将 实现
  • 如果 promise.then(undefined, r) 将调用 r "as soon as possible"
  • ,则承诺被 拒绝
  • 如果承诺既未实现也未被拒绝,则该承诺是待定

命运:

  • 一个承诺是 resolved 如果尝试解决或拒绝它没有效果,即承诺已经 "locked in" 遵循另一个承诺,或者已经实现或拒绝
  • 承诺如果未解决,则为未解决,即,如果尝试解决或拒绝它将对承诺产生影响。

关注link了解详情'relating states and fates'。