如果promise在此之前完成,会发生什么?

What happens if a promise completes before then is called?

本文关键字:什么 promise 在此之前 如果      更新时间:2023-09-26

假设我有一个这样的Promise:

var promise = new Promise(function(resolve, reject) {
    // Do some async thing
});
promise.then(function(response) {
    // Then do some other stuff
});

如果async Promise在我调用.then()之前完成会发生什么?通常,我只在Promise函数中运行长时间的任务,但是如果它一次完成得非常快呢?

如预期的那样:在这种情况下,如果callback在promise已经解决后被调用,那么callback将立即被调用。

很容易测试:

var promise = new Promise(function(resolve, reject) {
    resolve(123);
});
setTimeout(function() {
  promise.then(function(response) {
      alert(response);
  });
}, 1000)

正如其他人已经指出的那样,您可以在承诺解决之前或之后使用.then添加回调,甚至可以添加多个回调。

这些回调将按照它们被添加的顺序调用,但总是异步的,事件循环的当前回合之后。因此,如果当您添加.then时承诺已经解决,则您的处理程序将立即被调用,但在"异步意义"下。

Promises/A+规范说:

[…onFulfilledonRejected异步执行,在then被调用的事件循环之后,使用一个新的堆栈。

promise具有状态,这意味着即使在promise被实现之后,您也可以使用.then将回调函数附加到它上,并且它们将被调用,并且在它们被附加之后得到与promise被实现相同的结果。

实现是成功承诺的最终状态。这意味着您可以在将来将更多的处理程序附加到已完成的承诺上,使用承诺作为原始响应的缓存。

.then() on MDN

那么()

在此promise出现时立即调用所提供的函数之一满足或拒绝。返回一个新的promise,它的状态会发生变化取决于此承诺和提供的回调函数。

适当的回调总是在此方法返回后调用,即使这个承诺已经实现或被拒绝。你也可以在同一个promise上多次调用then方法,并且回调函数的调用顺序与注册顺序相同。

在承诺是resolved之前,then回调将永远不会被调用,这就是我认为您所说的完整。然而,如果promise在从函数返回之前被解析,那么在此之后链接的任何其他成功回调函数仍将被执行。例如,

function getMeAResolvedPromise() {
    var prom = new Promise();
    prom.resolve('some val');
    return prom;
}
...
getMeAResolvedPromise.then(function(result) {
    // this will still be executed
});

我很惊讶没有人提到MicroTasks队列。

即使解决承诺的.then也不会立即执行:

const prom = Promise.resolve(11); // value's ready
prom.then(console.log); 
console.log(22); 
// prints 22 11

在已解决的promise上调用.then调度一个微任务,该微任务将在调用堆栈变为空时执行。