NODE中非同步之間的協作
阿新 • • 發佈:2019-01-01
非同步IO與同步IO在時間表現上,非同步IO預期於最慢一個IO,而同步IO則是所有IO的總和。但是非同步IO的結果也是需要統一處理的。因此就涉及到多非同步之間的協作。
在node中,我們在全域性上設定一個哨兵變數來協作。
下面程式碼使用process.nextTick來模擬一次非同步的IO:
"use strict";
process.nextTick(function(){
console.log('nextTick的執行');
done();//每次呼叫count自增1
});
process.nextTick(function(){
console.log('nextTick的執行');
done();//每次呼叫count自增1
});
process.nextTick(function(){
console.log('nextTick的執行');
done();//每次呼叫count自增1
});
var count=0;//哨兵變數
var done=function(){
count++;
if(count===3){//當count為3的時候,說明三個非同步都完成了,執行非同步完成的處理
console.log('全部非同步IO完成');
}
}
如果有多個方法需要處理非同步的結果,我們可以增加多一個函式。由於哨兵變數是全域性的,因此我們不需要再增加一個哨兵變數:
"use strict"; process.nextTick(function(){ console.log('nextTick的執行'); done(); done2(); }); process.nextTick(function(){ console.log('nextTick的執行'); done(); done2(); }); process.nextTick(function(){ console.log('nextTick的執行'); done(); done2(); }); var count=0; var done=function(){ count++; if(count===3){ console.log('done1:全部非同步IO完成'); } } var done2=function(){ if(count===3){ console.log('done2:全部非同步IO完成'); } }
隨著業務增長,如果done的數量越來越多,則可以使用事件釋出/訂閱來實現。這種方法在深入淺出node中有提到過:
"use strict"; const events = require('events'); var emitter=new events.EventEmitter(); process.nextTick(function(){ console.log('nextTick的執行'); emitter.emit("done"); }); process.nextTick(function(){ console.log('nextTick的執行'); emitter.emit("done"); }); process.nextTick(function(){ console.log('nextTick的執行'); emitter.emit("done"); }); var count=0; var done=function(){ count++; if(count===3){ console.log('done1:全部非同步IO完成'); } } var done2=function(){ if(count===3){ console.log('done2:全部非同步IO完成'); } } emitter.on('done',done); emitter.on('done',done2);
可以看到,使用了emitter之後,我們不需要在每個非同步中加入done、done2等等等,直接使用emitter.emit('done')便可。