Promise.resolve与vanilla js中的新Promise(解决)

时间:2017-09-23 08:01:38

标签: javascript es6-promise event-loop

The relevant question告诉我解决了一个新的承诺,即使它立即得到解决,也会安排到下一个循环。但是,评论部分似乎是反例。

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);
})

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

注意:问题与the popular one不一样。只关注订单问题:为什么不同的模式产生不同的顺序?并且优先考虑事件循环的解释。

2 个答案:

答案 0 :(得分:1)

在承诺处于已结算(已履行或已拒绝)状态之前,

promise.then的回调不会附加到微任务队列。微队任务将从队列中顺序执行,即“先进先出”。

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

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

答案 1 :(得分:0)

注释的.then()日志会生成调用代码的顺序。

// logs `"p1"`, `"p2"`
var p1 = Promise.resolve("p1")

var p2 = Promise.resolve(Promise.resolve("p2")); 

p1.then(function(value){
  console.log(value);
})

p2.then(function(value){
  console.log(value);
})

// logs `"p2"`, `"p1"`
var p1 = Promise.resolve("p1")

var p2 = Promise.resolve(Promise.resolve("p2")); 

p2.then(function(value){
  console.log(value);
})

p1.then(function(value){
  console.log(value);
})