Promise.resolve 与 vanilla js 中的 new Promise(resolve)

Pag*_*eYe 5 javascript event-loop es6-promise

相关问题告诉我,解决一个新的承诺,即使它立即得到解决,它也被安排在下一个循环中。不过,评论部分似乎是反例。

var p1 = Promise.resolve("p1")

/* console order will be "p2" "p1" */ 
// pattern1
// var p2 = Promise.resolve(Promise.resolve("p2")); 
// pattern2
// var p2 = Promise.resolve(new Promise(function(resolve, reject){
//   resolve("p2")
// }))

/* console order will be "p1" "p2" */ 
// pattern3
var p2 = new Promise(function(resolve, reject){
    resolve(Promise.resolve("p2"));
}) 

p2.then(function(value){
  console.log(value);
})
p1.then(function(value){
  console.log(value);
})
Run Code Online (Sandbox Code Playgroud)

在 Chrome v61.0.3163.91 中很奇怪,但在 Node.js 中正常。

注意:这个问题与流行的问题不一样。只需关注顺序问题:为什么不同的模式会产生不同的顺序?首选事件循环方面的解释。

Pag*_*eYe 3

promise.then的回调不会被追加到微任务队列,直到 Promise 处于已解决(已完成或已拒绝)状态。微任务将从队列中顺序执行,即“先进先出”。

在Chrome v61.0.3163.91的实现中,一旦p1创建,就始终处于已解决状态。p2在pattern1和pattern2中处于已解决状态,而p2在pattern3中处于待处理状态。

因此,在pattern1和pattern2中,p2.then的回调首先追加到微任务队列中并首先执行。在pattern3中,虽然p2.then先执行,但由于promise仍处于pending状态,因此它会在将来将回调追加到微任务队列中。Sop1.then的回调首先执行。