什么是javascript承诺的正确术语

时间:2015-03-25 23:38:44

标签: javascript promise

我对被抛出的不同术语感到困惑。根据我的理解,承诺可以是:

fulfilled
rejected
pending 
settled
resolved
defer

解决方案意味着解决了吗?还是意味着它实现了?什么是推迟的?

3 个答案:

答案 0 :(得分:43)

术语可能很难 我们来自Promises/A+ specificationrespective ES6 section 3个州

  • 待定 - 承诺尚未获得价值,未来仍未确定。
  • 已履行 - 承诺成功获得结果值“已分配”
  • 被拒绝 - 承诺提供原因为什么无法获取结果,通常是错误。

已解决这个术语是履行和拒绝的超名称,意思是 - 与待定相反。

动态谓词履行拒绝描述将状态从待处理更改为已履行或已拒绝。这些转换称为承诺的履行拒绝

那些很容易。现在,解决是一个不同的野兽。它有时被用作“履行”的同义词,但最好将其理解为将承诺的命运解决为履行或拒绝。承诺的分辨率(很少:结算)意味着它将离开暂挂状态。但即使这样也不准确 - 问题是承诺解决程序的递归性质:

  • 用“普通”价值解决承诺意味着履行它
  • 用承诺(或者说)来解决承诺意味着采用其状态:

    • 以履行承诺解决问题是一项成就
    • 以拒绝承诺解决是拒绝
    • 解决待处理的承诺意味着等待其解决方案

是的,如果承诺得到解决,甚至可能不知道它是否会被履行或拒绝。但这意味着命运 不再未确定 ,因为它与我们解决的承诺相关(请注意,您只能解决一次承诺)。

忽略这种特殊情况,已解决的承诺通常意味着已解决的承诺。

或者,引用ECMAScript 6 Specification

  

承诺已解决如果已解决,或者已被“锁定”以匹配另一个承诺的状态。尝试解决或拒绝已解决的承诺无效。如果未解决,则承诺未解析。未解决的承诺始终处于暂挂状态。已解决的承诺可能正在等待,履行或拒绝。


  

什么是推迟的?

延迟结果意味着您返回结果的(异步)承诺,而不是直接(同步)返回结果。并且还会返回延期拒绝instead of throwing synchronously

请注意,“延迟”也会在某些库(Q)中用作构建Deferred对象的方法名称 - 请参阅this answer on The differences between Deferred, Promise and Future好的解释。
哦,永远不要相信变量名称:defer也可能是缩写的“deferredObject”。

答案 1 :(得分:10)

三个承诺状态列在section 2.1 of the Promises/A+ specification

来自规范:

enter image description here

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

待定是初始承诺状态。承诺所代表的操作尚未被填写或拒绝。

实现是三个承诺状态中的另一个。这意味着承诺已经解决,现在已经解决了价值。承诺所代表的业务已成功完成。

拒绝是三个承诺状态中的另一个。这意味着承诺已经被拒绝,现在已经被拒绝了。 promise所代表的操作无法获取值,因此有理由不这样做(通常是错误代码或错误对象,但它可以是任何东西)。

已结算这个术语意味着承诺已经履行或被拒绝(例如,它不会再等待),但它不是一个单独的状态,只是一个描述性术语,表明它已不再等待

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

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

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

使用deferred对象的jQuery示例:

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();
 });

答案 2 :(得分:1)

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

国:

  • 如果promise.then(f)将尽快调用f“
  • 已履行承诺 如果promise.then(undefined, r)将尽快调用r“
  • 承诺被拒绝
  • 承诺待定如果既未履行也未被拒绝。

命运:

  • 承诺已解决如果试图解决或拒绝它无效,即承诺已被“锁定”以遵循其他承诺,或已履行或被拒绝
  • 如果未解决承诺未解决,即如果尝试解决或拒绝它将对承诺产生影响。

请点击链接了解有关州和命运的详细信息。