程序员深究JavaScript

JavaScript 异步

2015-12-11  本文已影响575人  KeKeMars

浏览器环境异步队列

setImmediate(function(){
    console.log(1);
},0);
setTimeout(function(){
    console.log(2);
},0);
new Promise(function(resolve){
    console.log(3);
    resolve();
    console.log(4);
}).then(function(){
    console.log(5);
});
console.log(6);
process.nextTick(function(){
    console.log(7);
});
console.log(8);

结果: 3 4 6 8 7 5 2 1

事件的注册顺序如下:setImmediate - setTimeout - promise.then - process.nextTick

优先级关系如下:process.nextTick > promise.then > setTimeout > setImmediate

消息是有分类别的,按照性质,划分为两大类:macrotaskmicrotask

注意:先从macrotask取,再从microtask取;macrotask queue是一次取一个,microtask queue是一次取所有(下次如无,则不取);

// 以下这一整段代码(来自题目,有做修改)作为macrotasks被添加进相应队列

setTimeout(function A(){console.log(4)},0);  // 函数A作为macrotasks被添加进相应队列
new Promise(function(resolve){
    console.log(1)
    for( var i=0 ; i<10000 ; i++ ){
        i==9999 && resolve()
    }
    console.log(2)
}).then(function B(){ // 已经fullfill,因此函数B立刻作为microtask被添加进相应队列
    console.log(5)
}).then(function C(){ // 函数C作为microtask被添加进相应队列
    consoele.log(6)
});
console.log(3);

结果就是:

nodejs异步IO

nodejs的IO执行过程

参考

上一篇 下一篇

猜你喜欢

热点阅读