瀏覽器環(huán)境異步隊(duì)列
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);
結(jié)果: 3 4 6 8 7 5 2 1
事件的注冊(cè)順序如下:setImmediate - setTimeout - promise.then - process.nextTick
優(yōu)先級(jí)關(guān)系如下:process.nextTick > promise.then > setTimeout > setImmediate
消息是有分類別的,按照性質(zhì),劃分為兩大類:macrotask和 microtask
macrotasks: script(你的全部JS代碼,“同步代碼”), setTimeout, setInterval, setImmediate, I/O, UI rendering
microtasks: process.nextTick,Promises, Object.observe, MutationObserver
js引擎首先從macrotask queue中取出第一個(gè)任務(wù),執(zhí)行完畢后,將microtask
queue中的所有任務(wù)取出,按順序全部執(zhí)行;然后再?gòu)膍acrotask queue中取下一個(gè),執(zhí)行完畢后,再次將microtask
queue中的全部取出;循環(huán)往復(fù),直到兩個(gè)queue中的任務(wù)都取完。
注意:先從macrotask取,再?gòu)膍icrotask??;macrotask queue是一次取一個(gè),microtask queue是一次取所有(下次如無(wú),則不?。?;
// 以下這一整段代碼(來(lái)自題目,有做修改)作為macrotasks被添加進(jìn)相應(yīng)隊(duì)列
setTimeout(function A(){console.log(4)},0); // 函數(shù)A作為macrotasks被添加進(jìn)相應(yīng)隊(duì)列
new Promise(function(resolve){
console.log(1)
for( var i=0 ; i<10000 ; i++ ){
i==9999 && resolve()
}
console.log(2)
}).then(function B(){ // 已經(jīng)fullfill,因此函數(shù)B立刻作為microtask被添加進(jìn)相應(yīng)隊(duì)列
console.log(5)
}).then(function C(){ // 函數(shù)C作為microtask被添加進(jìn)相應(yīng)隊(duì)列
consoele.log(6)
});
console.log(3);
結(jié)果就是:
- 先從macrotask取你的同步代碼,打印1,2,3
- 再?gòu)膍icrotask取函數(shù)B、C,打印5,6
- 再?gòu)膍acrotask取函數(shù)A,打印4
nodejs異步IO

nodejs的IO執(zhí)行過程
- nodejs通過libev事件得到IO執(zhí)行狀態(tài),而不是輪詢,提高了CPU利用率。
- 雖然nodejs是單線程的,但它的IO操作是多線程的,多個(gè)IO請(qǐng)求會(huì)創(chuàng)建多個(gè)libeio線程(最多4個(gè)),使通常情況的IO操作性能得到提高。
- 但是當(dāng)IO操作情況比較復(fù)雜的時(shí)候,有可能造成線程競(jìng)爭(zhēng)狀態(tài),導(dǎo)致IO性能降低;而且libeio最多創(chuàng)建4個(gè)線程,當(dāng)同時(shí)有大量IO請(qǐng)求時(shí),實(shí)際性能有待測(cè)量。另外,由于每個(gè)IO請(qǐng)求對(duì)應(yīng)一個(gè)libeio的數(shù)據(jù)結(jié)構(gòu),當(dāng)同時(shí)有大量IO操作駐留在系統(tǒng)中時(shí)候,會(huì)增加內(nèi)存開銷。
- Libeio為了實(shí)現(xiàn)異步IO功能,帶來(lái)了額外的管理,當(dāng)IO數(shù)據(jù)量比較小的時(shí)候,整體性能不一定比同步IO好。