bluebird和原生Promise 对于then的执行顺序的区别

当使用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的处理是什么情况?

阅读 3.2k
2 个回答

初始的宏任务执行完就会把微任务一口气清掉了吧。
原生的Promise肯定是微任务,所以是2,3,5, (转到微任务队列)6,4, (微任务清空了又回到宏任务setTimeout)1.

bluebird的Promise不是原生,应该只能用setTimeout来模拟异步了(不是原生,无法操作底层的宏/微任务队列吧,也无法决定自己的任务是属于宏任务还是微任务。你试试自己实现一个Promise,也只能用setTimeout模拟,输出的顺序应该和bluebird的一样,我也没试过哈哈)。
bluebird情况下:2,3,5, (转到微任务队列,只有一个原生的process.nextTick是微任务)6, (微任务清空了又回到宏任务,两个都是setTimeout)1,4.

猜测:
对于原生Promise, 属于微任务操作,优先执行
bluebird的实现与原生的Promise机制不太一样,貌似是通过 .then 形式添加的回调函数,甚至都在异步操作完成之后才被添加的函数,都会被调用,,所以对于then会放在宏任务处理。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题