什么是Javascript的承诺正确的术语什么是Javascript的承诺正确的术语(What is

2019-05-10 11:17发布

我越来越迷茫与各地抛出的不同术语。 从我的理解,一个承诺可以是:

fulfilled
rejected
pending 
settled
resolved
defer

是否意味着解决落户? 还是意味着其实现? 而到底是什么推迟?

Answer 1:

术语能吃苦耐劳。
让我们从采取承诺/ A +规格和相应的ES6部分有3种状态

  • 待定 -承诺不采取了值的是,它的未来仍不明朗。
  • 兑现 -许成功拿到一个结果值 “分配”
  • 拒绝 -承诺给出为什么没有结果可能被收购,通常是一个错误的理由

结算的术语是用于hyperonym满足和拒绝,这意味着要么-未决的相反。

动态动词履行拒绝描述从挂起进入任一个满足或拒绝改变的状态。 这些转变被称为履行拒绝承诺。

这些都是很容易。 现在, 决心是一个不同的野兽。 它有时被用来同义词“完成”,但它会更好地被理解为解决许的命运要么履行或拒绝。 该决议 :一诺(很少结算)是指离开待定状态。 但是,即使不说是正确的-问题是承诺解决程序的递归特性:

  • 解决与“纯”值的承诺意味着满足它
  • 解决与一个承诺(或thenable)一个承诺指通过其状态:

    • 具有履行承诺解决是实现
    • 用拒绝承诺解决是拒绝
    • 与未决承诺解决就意味着要等其分辨率

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

忽略这种特殊的情况下, 解决的承诺通常意味着一个稳定的承诺。

或者,举的ECMAScript 6规格 :

如果和解或 允诺解决,如果它已被“锁定”,以配合其他承诺的状态。 试图解决或拒绝解决的承诺没有效果。 一诺是未解决的,如果它没有得到解决。 一个悬而未决的承诺始终处于待定状态。 被解析的承诺可能正在申请,履行或拒绝。


而到底是什么推迟?

推迟的结果意味着你返回结果的(异步)的承诺,而不是直接的结果(同步)。 而且还返回递延拒绝同步投掷,而不是 。

请注意,“ 推迟 ”也在一些库(用于Q )作为方法名构建Deferred对象-见递延,承诺和未来之间的区别这个答案的一个很好的解释。
哦,永远不要相信变量名: defer很可能会成为一个缩写为“deferredObject”。



Answer 2:

三个诺州列在所述承诺/ A +规范的第2.1节 。

从规格:

因此,这里有每次问起术语:

是最初的承诺状态。 受许代表的操作尚未filfilled或拒绝。

达到的是另一个三个诺状态。 这意味着承诺已经解决,现在有了解决的价值。 受许代表的操作已成功完成。

拒绝是另一个三个诺状态。 这意味着承诺已被拒绝,现在有拒绝的理由。 通过承诺表示的操作失败,以获得值并且因此具有为不这样做的一个原因(通常是错误代码或错误的对象,但它可以是任何东西)。

安顿是一个术语,指的承诺要么履行或拒绝(例如,它没有任何等待更多),但它不是一个独立的国家只是一个描述性的词语来表示它不再悬而未决。

解决的是经常被用来指同为期限fulfilled ,但两者并不完全相同。 允诺可以导致履行或者它可以与被拒绝的承诺(这会导致拒绝这一承诺的)来解决,也可以用一个悬而未决的承诺(这意味着它现在将等待最终解决的值来解决其他一些承诺的状态)。

这很难说清楚,你被延迟的意思。 承诺常常分类为deferred的,因为它们是一个对象,它表示一个动作,并导致被推迟到以后(它会在未来发生的)对象。 在某些承诺的实现,实际上有两种类型的对象,一个deferred对象和promise的对象。 递延对象是承诺对象的超集。 当动作被解决或拒绝它们都可以观察到.then()处理程序。 但是,只有deferred对象实际上可以将状态更改为resolvedrejected

在jQuery中,你可以创建一个延迟对象$.Deferred() 在其他实现方式,如ES6的承诺,你就必须有一个构造函数的回调已经承诺对象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();
 });


Answer 3:

Domenic Denicola的“ 国家与命运 ”是一个很好的,精辟的总结。

状态:

  • 如果一个承诺满足 promise.then(f) “尽快”将调用F
  • 如果一个承诺被拒绝 promise.then(undefined, r) “尽快”将调用[R
  • 如果既不符合也不拒绝承诺挂起

命运:

  • 如果试图解决或拒绝它没有任何效果,即承诺已被“锁定在”要么跟着另一个承诺,或已履行或拒绝承诺解决
  • 承诺没有得到解决 ,如果问题没有解决,即,如果试图解决或拒绝它将对承诺产生影响。

按照链接了解详细信息“关于状态和命运”。



文章来源: What is the correct terminology for javascript promises