1. 程式人生 > >NODE中非同步之間的協作

NODE中非同步之間的協作

非同步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')便可。