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

Con*_*cer 22 javascript promise

假设我有这样一个Promise:

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

如果async Promise在我打电话之前完成.then()会怎么样?通常情况下,我只会在Promise函数中执行长时间运行的任务,但如果它一次完成很快就会怎么样?

dfs*_*fsq 26

正如所料:如果在promise已经解决之后调用,那么在这种情况下将立即调用回调.

它很容易测试:

var promise = new Promise(function(resolve, reject) {
    resolve(123);
});

setTimeout(function() {
  promise.then(function(response) {
      alert(response);
  });
}, 1000)
Run Code Online (Sandbox Code Playgroud)

  • "立即"在这种情况下或在最好的情况下有点误导,而不是描述性的.它很快被调用,但仍然是异步调用的.所有`.then()`处理程序总是与promise规范的promises异步调用.因此,在`promise.then(...)`之后的一行代码将在调用`.then()`处理函数之前执行,即使已经解决了promise. (14认同)

pde*_*nes 13

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

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

承诺/ A +规格的说:

[...] onFulfilledonRejectedthen调用事件循环之后异步执行,并使用新堆栈.


Ori*_*ori 5

一个promise具有状态,这意味着即使在实现promise后,您也可以使用.then它附加回调,然后将调用它们,其结果与附加promise后的promise相同。

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

.then()在MDN上

然后()

兑现或拒绝此诺言后,立即调用提供的功能之一。返回一个新的promise,其状态根据此promise和提供的回调函数而变化。

即使此承诺已经实现或被拒绝,总是在此方法返回后调用适当的回调。您还可以在相同的Promise上多次调用then方法,并且回调将按照注册时的相同顺序被调用。