我确信下面的所有代码(除了
因此,我预计结果首先是 resolve(Promise.resolve(p2))
之外)都是同步的。p2
,因为 p2.then
首先运行。然而 p1
在控制台中首先出现。
MDN 没有与该问题相关的内容。 规范有一些细节吗?有人可以逐步清楚地说明解决 promise 时会发生什么吗?
Chrome v60.0.3112.113
我的代码是:
var p1 = new Promise(function(resolve, reject){
resolve("p1");
});
var p2 = new Promise(function(resolve, reject){
//resolve("p2");
var tempP = Promise.resolve("p2"); // for better description in discussion
resolve(tempP);
});
p2.then(function(value){
console.log(value)
})
p1.then(function(value){
console.log(value);
});
最佳答案
I am sure that all the codes below, except
resolve(Promise.resolve(p2))
, are synchronous.
没有。 then
回调从不同步调用,它们始终是异步的(这很好)。这意味着它们的相对顺序是不确定的,并且取决于各自的 promise 何时兑现。如果您关心回调的顺序,请通过将 promise 相互链接起来使其明确。
示例中的履行顺序取决于您解决 promise 的值。请注意,在 p1
和 p2
中,new Promise
回调和您的 resolve
都是同步的。每个解决方案都被放入队列中 - 至少与您似乎正在使用的原生 ES6 promise 一样。不同之处在于,您的 p2
是通过 Promise.resolve("p2")
解析的,它将使用其他 Promise 的结果解析 p2
- 再次放回到队列中。因此,p1
的实现首先发生,并且在 p2
的实现回调之前调用该回调。
所以一步一步发生的是
new Promise
调用构造函数回调,而构造函数回调又解决
值为“p1”
的新 promise - 履行它new Promise
返回,并将值分配给p1
。new Promise
调用构造函数回调,而构造函数回调又- 构造另一个用值
“p2”实现的promise
- 并用它来
resolve
s新的promise - 添加另一个resolve
作为promise完成时的回调 - 内部 promise 安排回调,因为它已经完成
new Promise
返回,并将值分配给p2
。- 调用
p2.then
并注册履行回调 - 调用
p1.then
并安排履行回调,因为p1
已履行
之后,异步:
- 调用内部 Promise 的回调并使用值
"p2
解析p2
- 履行它并调度其注册的回调 - 调用
p1
回调并记录“p1”
- 调用
p2
回调并记录“p2”
关于javascript - 解决 promise 是一个异步过程吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46326034/