什么是JavaScript的承诺正确的术语

我正在混淆不同的术语。 从我的理解,一个承诺可以是:

fulfilled rejected pending settled resolved defer 

解决意味着解决? 还是这意味着它的履行? 什么是延迟?

术语可能很难。
我们从Promises / A +规范和相应的ES6部分可以得到3个状态

  • 待定 – 承诺还没有拿到价值,未来还是不确定的。
  • 履行 – 承诺成功地得到了一个结果值 “分配”
  • 被拒绝 – 这个承诺给了一个原因,为什么没有结果可以获得,通常是一个错误。

结算一词是一个用于实现和拒绝的同义词,意思是 – 与未决的相反。

dynamic动词履行拒绝描述从待决状态改变到被履行或被拒绝。 这些转变被称为履行拒绝承诺。

那些很简单。 现在, 解决是一个不同的野兽。 它有时被用作“履行”的同义词,但最好被理解为解决承诺的命运,要么完成,要么被拒绝。 承诺的解决 (很less:结算)意味着它离开待定状态。 但即便如此,问题仍然是Promise Resolution Procedure的recursion性质:

  • 用“简单”的价值来解决承诺就意味着实现
  • 用承诺解决承诺意味着采用它的状态:

    • 以履行的承诺来解决是一个履行
    • 以拒绝承诺解决是一个拒绝
    • 解决悬而未决的问题意味着等待解决scheme

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

忽视这个特殊情况, 解决的承诺通常意味着一个解决的承诺。

或者,引用ECMAScript 6规范 :

一个承诺 如果解决了,或者被“locking”以符合另一个承诺的状态,那么这个 承诺就会被解决 试图解决或拒绝已解决的承诺不起作用。 如果没有解决, 承诺是 没有解决的。 未解决的承诺总是处于未决状态。 已经解决的承诺可能正在等待,实现或被拒绝。


什么是延迟?

推迟一个结果意味着你返回一个(asynchronous)promise的结果,而不是结果直接(同步)。 而且还返回一个延迟拒绝而不是同步投掷 。

请注意,“ 延迟 ”也用于某些库( Q )作为构buildDeferred对象的方法名称 – 请参阅“延迟”,“承诺”和“未来”之间的区别
哦,永远不要相信variables名称: defer也可能是一个缩写“deferredObject”。

Promise / A +规范的第2.1节列出了三个承诺状态。

从规格:

在这里输入图像描述

所以这里是你问到的每一个术语:

待定是最初的承诺状态。 承诺所代表的行为尚未被填补或拒绝。

履行是三个承诺国家的另一个。 这意味着承诺已经解决,现在已经解决了价值。 承诺所代表的操作已经成功完成。

被拒绝的是另外三个承诺国家。 这意味着承诺已经被拒绝,现在被拒绝的原因。 由promise表示的操作未能获得值,因此有失败的原因(通常是错误代码或错误对象,但可以是任何东西)。

“结算”是一个术语,表示承诺要么被履行,要么被拒绝(例如,它不再是等待的),但它不是一个单独的状态,只是一个描述性的术语来表明它不再是未决的。

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

迟迟不能确切地说出你的意思。 承诺通常被归类为deferred对象,因为它们是一个代表一个行动的对象,并且推迟到将来(将来会发生)。 在一些promise实现中,实际上有两种types的对象,一个deferred对象和一个promise对象。 延迟对象是承诺对象的超集。 两者都可以通过.then()处理程序观察动作何时解决或拒绝。 但是,只有deferred对象实际上可以改变状态来resolvedrejected

在jQuery中,您可以使用$.Deferred()创build延迟对象。 在诸如ES6承诺的其他实现中,您只需拥有具有rejectresolve函数的构造函数callback的promise对象。 世界正在向着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(); }); 

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

状态:

  • promise.then(f)会尽快打电话给f,
  • 如果承诺被拒绝,那么promise.then(undefined, r)将尽可能快地调用r
  • 如果未履行或拒绝承诺,则等待承诺。

命运:

  • 如果试图解决或拒绝承诺是没有效果的,那么承诺就被解决了,也就是承诺被“locking”,以履行另一个承诺,或已经履行或被拒绝
  • 一个承诺如果没有得到解决,如果试图解决或拒绝承诺会影响承诺,这个承诺是没有解决的。

请按照链接了解“相关状态和命运”。