当使用bluebird和nodejs原生Promise执行下列代码时,其执行顺序有些出入,请问一下这个是因为什么?
/**
* 若用bluebird,则输出顺序为 2 3 5 6 1 4
* 原生Promise,则输出顺序为 2 3 5 6 4 1
*/
// var Promise = require("bluebird");
setTimeout(() => {
console.log("1");
}, 0);
process.nextTick(function() {
console.log("6");
});
new Promise(function(resolve, reject) {
console.log("2");
var st = new Date().getTime();
while(new Date().getTime() - st < 1000) {}
resolve("ok");
console.log("3");
})
.then(function() {
console.log("4");
});
console.log("5");
问题思考:
1、原生的Promise对于then的处理是放在微任务队列,所以较之于宏任务(setTimeout)优先执行,是这样的吗?
2、对于bluebird中then的处理是什么情况?
初始的宏任务执行完就会把微任务一口气清掉了吧。
原生的Promise肯定是微任务,所以是2,3,5, (转到微任务队列)6,4, (微任务清空了又回到宏任务setTimeout)1.
bluebird的Promise不是原生,应该只能用setTimeout来模拟异步了(不是原生,无法操作底层的宏/微任务队列吧,也无法决定自己的任务是属于宏任务还是微任务。你试试自己实现一个Promise,也只能用setTimeout模拟,输出的顺序应该和bluebird的一样,我也没试过哈哈)。
bluebird情况下:2,3,5, (转到微任务队列,只有一个原生的process.nextTick是微任务)6, (微任务清空了又回到宏任务,两个都是setTimeout)1,4.