Promise.resolve vs 香草 js 中的新 Promise(resolve)
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.
中正常
注意:问题与 the popular one 不同。只关注顺序问题:为什么不同的模式会产生不同的顺序? 并且最好根据事件循环进行解释。
评论的 .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);
})
promise.then
的回调不会被附加到微任务队列中,直到 promise 处于已解决状态(已履行或已拒绝)。 Microtask 将从队列顺序执行,即 "First In, First Out".
在Chromev61.0.3163.91的实现中,一旦p1
创建,就一直处于resolved状态。 pattern1和pattern2中的p2
状态为resolved,pattern3中的p2
状态为pending。
因此,在pattern1和pattern2中,p2.then
的callback先追加到microtask队列,先执行。在 pattern3 中,虽然 p2.then
先执行了,但是由于 promise 还处于 pending 状态,它会在以后追加回调到 microtask 队列中。所以p1.then
的回调先执行。
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 不同。只关注顺序问题:为什么不同的模式会产生不同的顺序? 并且最好根据事件循环进行解释。
评论的 .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);
})
promise.then
的回调不会被附加到微任务队列中,直到 promise 处于已解决状态(已履行或已拒绝)。 Microtask 将从队列顺序执行,即 "First In, First Out".
在Chromev61.0.3163.91的实现中,一旦p1
创建,就一直处于resolved状态。 pattern1和pattern2中的p2
状态为resolved,pattern3中的p2
状态为pending。
因此,在pattern1和pattern2中,p2.then
的callback先追加到microtask队列,先执行。在 pattern3 中,虽然 p2.then
先执行了,但是由于 promise 还处于 pending 状态,它会在以后追加回调到 microtask 队列中。所以p1.then
的回调先执行。