我对各种术语感到困惑。据我理解,Promise 可以是:
- 已完成
- 已拒绝
- 待定
- 已解决
- 已解决
- 延迟
“已解决”是指已经“已完成”吗?还是说它已经被“已解决”了?而“延迟”到底是什么意思?
我对各种术语感到困惑。据我理解,Promise 可以是:
“已解决”是指已经“已完成”吗?还是说它已经被“已解决”了?而“延迟”到底是什么意思?
术语可能很难理解。
让我们从Promises/A+规范和相应的ES6章节中了解到,有3种状态:
术语settled是fulfilled和rejected的总称,意思是-与pending相反。
动态动词fulfill和reject描述了将状态从pending更改为fulfilled或rejected。这些转换称为承诺的fulfillment或rejection。
这些都很简单。现在,resolve 是一个不同的问题。它有时被用作“履行”的同义词,但更好地理解为将承诺的命运解决为已实现或已拒绝。承诺的解决(很少:解决)意味着它离开了待定状态。但即使如此也不准确——问题在于Promise Resolution Procedure的递归性质:
使用“普通”值解决承诺意味着实现它
使用承诺(或可解决对象)解决承诺意味着采用其状态:
是的,如果承诺得到解决,甚至可能不知道它是否会被实现或拒绝。但它意味着命运不再未定,因为它与我们解决的承诺相关联——请注意,您只能解决一次承诺,不能通过再次调用resolve
/reject
将其解决为不同的值。
忽略这种特殊情况,一个已解决的 Promise 通常意味着一个已经处理了的 promise。
或者引用 ECMAScript 6规范:
如果 Promise 已经被"锁定"以匹配另一个 promise 的状态,则该 Promise 被认为是已解决的。尝试解决或拒绝一个已解决的 Promise 没有任何效果。如果 Promise 没有被解决,则它始终处于等待状态。已解决的 Promise 可能处于等待、已实现或已拒绝状态。
Deferred
对象的方法名 - 参见this answer on The differences between Deferred, Promise and Future以获取更好的解释。
噢,千万不要信任变量名: defer
可能同样是“deferredObject”的缩写。Promise.resolve(..)
或new Promise((resolve, _) => {resolve(..)})
只会创建一个已实现的promise,而不会创建一个被拒绝的promise。然而,对于非promise thenable的不寻常情况,它可以拒绝或实现(即解决)。因此,“解决或匹配另一个promise的状态”实际上是正确的。 - mdcq三种 Promise 状态在 Promises/A+ 规范的 2.1 节 中列出。
来自规范:
以下是您所询问的每个术语:
Pending 是初始的承诺状态。代表承诺的操作尚未被履行或拒绝。
Fulfilled 是另外三种承诺状态之一。它意味着承诺已经解决并且现在具有其解决值。代表承诺的操作已成功完成。
Rejected 是另外三种承诺状态之一。它意味着承诺已被拒绝并且现在具有其拒绝原因。代表承诺的操作未能获得值,因此有一个失败的原因(通常是错误代码或错误对象,但可以是任何内容)。
Settled 是一个术语,表示承诺已经被兑现或拒绝(例如,它不再是待定状态),但它不是一个单独的状态,只是一个描述性术语,用于指示它不再是待定状态。
已解决是一个经常用来表示与已实现
相同的术语,但两者并不完全相同。承诺可以通过一个值得到解决,这会导致实现,也可以通过拒绝的承诺(这会导致该承诺被拒绝)或者可以通过挂起的承诺(这意味着它现在将等待某些其他承诺的最终状态)得到解决。
很难确切地说出你所说的延迟是什么意思。承诺通常被归类为延迟
对象,因为它们是代表将来推迟执行的操作和结果的对象(它将在未来发生)。在一些承诺的实现中,实际上有两种类型的对象,即延迟
对象和承诺
对象。延迟对象是承诺对象的超集。两者都可以使用.then()
处理程序观察操作何时被解决或拒绝。但是,只有延迟
对象可以实际更改状态为已解决
或已拒绝
。
$.Deferred()
创建延迟对象。在其他实现中,例如ES6 promises,您只需使用具有构造函数回调的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();
});