什么是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
对象实际上可以改变状态来resolved
或rejected
。
在jQuery中,您可以使用$.Deferred()
创build延迟对象。 在诸如ES6承诺的其他实现中,您只需拥有具有reject
和resolve
函数的构造函数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”,以履行另一个承诺,或已经履行或被拒绝
- 一个承诺如果没有得到解决,如果试图解决或拒绝承诺会影响承诺,这个承诺是没有解决的。
请按照链接了解“相关状态和命运”。