繁体   English   中英

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

[英]Promise.resolve vs new Promise(resolve) in vanilla js

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

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中是正常的。

注意:问题与流行的问题不一样。 只关注订单问题: 为什么不同的模式产生不同的顺序? 并且在事件循环方面的解释将是优选的。

promise.then的回调将不会附加到微任务队列,直到承诺处于已结算(已履行或已拒绝)状态。 微队任务将从队列中顺序执行,即“先进先出”。

在Chrome v61.0.3163.91的实现中,一旦创建了p1 ,它始终处于已解析状态。 p2在模式1和模式2是在解决了状态,而p2在pattern3是悬而未决的状态。

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

注释的.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); }) 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM