我对周围的不同术语感到困惑。根据我的理解,Promise可以是:
fulfilled
rejected
pending
settled
resolved
defer
解决就意味着解决吗?或者这是否意味着它实现了?什么是延迟?
我对周围的不同术语感到困惑。根据我的理解,Promise可以是:
fulfilled
rejected
pending
settled
resolved
defer
解决就意味着解决吗?或者这是否意味着它实现了?什么是延迟?
术语可能很难。
让我们从Promises/A+ 规范和相应的 ES6 部分中得知有3 种状态:
已解决一词是已完成和已拒绝的上位词,意思是两者之一 - 与未决相反。
动态动词fulfill和reject描述将状态从pending 更改为fulfilled 或rejected。这些转换称为Promise的履行或拒绝。
那些很容易。现在,决心是一个不同的野兽。它有时被用作“履行”的同义词,但最好将其理解为将Promise的命运安排为履行或拒绝。Promise的解决(很少:解决)意味着它离开待定状态。但即使这样也不准确 - 问题在于Promise解决程序的递归性质:
使用Promise(或 thenable)解决Promise意味着采用其状态:
是的,如果一个Promise得到解决,它甚至可能不知道它是否会被实现或被拒绝。但这意味着命运不再是不确定的,因为它与我们解决的Promise绑定在一起(请注意,您只能解决一次Promise)。
忽略这种特殊情况,已解决的Promise通常意味着已解决的Promise。
或者,引用ECMAScript 6 规范:
如果一个Promise被解决或者它被“锁定”以匹配另一个Promise的状态,那么它就会被解决。尝试解决或拒绝已解决的Promise没有效果。如果一个 promise没有被解决,它就是未解决的。未解决的Promise始终处于挂起状态。已解决的Promise可能是未决的、已完成的或被拒绝的。
什么是延迟?
推迟结果意味着您返回结果的(异步)Promise,而不是直接(同步)返回结果。并且还返回延迟拒绝而不是同步抛出。
请注意,在某些库 ( Q ) 中,“ defer ”也用作构造对象的方法名称- 请参阅有关Deferred、Promise 和 Future 之间的差异的答案以获得很好的解释。
哦,永远不要相信变量名:也可能是一个缩写的“deferredObject”。Deferred
defer
Promises/A+ 规范的第 2.1 节列出了三个 Promise 状态。
从规范:
所以这里是您询问的每个术语:
Pending是初始的 promise 状态。由Promise表示的操作尚未完成或拒绝。
达到的是另一个三个诺状态。这意味着Promise已经被解决,现在有它的解决value。Promise所代表的操作已经成功完成。
拒绝是三个Promise状态中的另一个。这意味着Promise已被拒绝,现在有被拒绝的原因。由 promise 表示的操作未能获取值,因此有失败的原因(通常是错误代码或错误对象,但可以是任何内容)。
Settled是一个术语,表示Promise要么被履行,要么被拒绝(例如,它不再是挂起的),但它不是一个单独的状态,只是一个描述性的术语,表明它不再是挂起的。
Resolved是一个经常用来表示与 相同的术语fulfilled
,但两者并不完全相同。一个Promise可以用一个导致履行的值来解决,也可以用一个被拒绝的Promise来解决(这会导致这个Promise被拒绝),或者它可以用一个挂起的Promise来解决(这意味着它现在将等待最终的其他一些Promise的状态)。
很难准确说出您所说的defer是什么意思。Promises 通常被归类为deferred
对象,因为它们是表示延迟到未来(它会在未来发生)的操作和结果的对象。在一些 promise 的实现中,实际上有两种类型的对象,一个deferred
对象和一个promise
对象。延迟对象是Promise对象的超集。两者都可以观察.then()
处理程序何时解决或拒绝操作。但是,只有deferred
对象才能真正将状态更改为resolved
或rejected
。
在 jQuery 中,您可以使用$.Deferred()
. 在其他实现中,例如 ES6 Promise,您只有Promise对象,其构造函数回调具有reject
和resolve
函数。世界大概正在朝着 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 Promise示例:
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) 的“国家与命运”( States and Fates ) 是一个很好的、精辟的总结。
状态:
promise.then(f)
promise.then(undefined, r)
命运:
点击链接了解“相关状态和命运”的详细信息。