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

标签 javascript es6-promise event-loop

The relevant question告诉我解决了一个新的 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);
})

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

注意:问题与 the popular one 不同.只需关注顺序问题:为什么不同的模式会产生不同的顺序?并且最好根据事件循环进行解释。

最佳答案

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

在Chrome v61.0.3163.91的实现中,p1一旦创建,就一直处于resolved状态。 pattern1和pattern2中的p2状态为resolved,pattern3中的p2状态为pending。

因此,在pattern1和pattern2中,p2.then的回调先追加到microtask队列,先执行。在 pattern3 中,虽然 p2.then 先执行了,但是由于 promise 还处于 pending 状态,它会在以后追加回调到 microtask 队列中。所以 p1.then 的回调首先执行。

关于javascript - Promise.resolve 与 vanilla js 中的 new Promise(resolve),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46377419/

相关文章:

c++ - Qt 或任何其他语言。事件循环

javascript - 如何检查NodeJS程序是否即将存在

javascript - 如何围绕网格旋转点?

javascript - 表单文件验证扩展名和大小 jquery 或 jscript

javascript - 将拒绝从外部 promise 传播到内部 promise

node.js - NodeJS、 promise 和性能

node.js - Express 应用程序中未处理的拒绝

node.js - 我们如何阻止事件循环?

javascript - 滚动到页面上值 = 'x' 的位置

javascript - 在一个接受数组并返回随机值的简单函数中 react js错误