最近寫nodejs比較多,剛開始的時候碰到的異步的操作比較少,因為想做的東西比較簡單,一查api有同步的,為了省事就直接用同步的搞了,慢慢發現這不是個事呀,好好的異步特性不用,非得用同步的,真囧,并且很多東西木有同步的api的。
好!寫異步的,慢慢的出現了這種代碼。。。
復制代碼 代碼如下:
mysql.query('xxxx').on('success', function(){
mysql.query('xxxx').on('success', function(){
mysql.query('xxxx').on('success', function(){
mysql.query('xxxx').on('success', function(){
mysql.query('xxxx').on('success', function(){
mysql.query('xxxx').on('success', function(){
//let's say fuck
});
});
});
});
});
});
TODO:不夠全面,比如說出錯的就沒有處理
復制代碼 代碼如下:
/*
* 異步管理器
* author : jser.me
*
* 使用方法:
* var asyncMg = require('./AsyncManager');
* asyncMg
* .push(function( next ){
* some_aysnc_method().on('success'{
* ....
* next();
* })
* })
* .push(function( next ){
* other_aysnc_method().on('success'{
* ....
* next();
* })
* })
* .push( ... )
* .run() //執行
* .on('success', function(){
* allThings_is_down();
* });
*
* push方法接受數組
*/
function typeOf( obj ){
return Object.prototype.toString.call( obj ).match(//[object ([^/]]*)/]/)[1];
}
function AsyncManager( arg ){
this.execArrys = [];
this.push( arg );
}
//使用系統帶的繼承方法
require('util').inherits( AsyncManager, require('events').EventEmitter );
//標記成功運行的函數數目
AsyncManager.prototype.succCount = 0;
//加入
AsyncManager.prototype.push = function( arg ) {
var This = this;
if( typeOf(arg) == 'Array' ){
arg.forEach( function(v,i){
This.execArrys.push( v );
});
} else {
This.execArrys.push( arg );
}
return this; //鏈一個
};
//執行
AsyncManager.prototype.run = function(){
var self = this;
if( this.succCount == this.execArrys.length ) {
//所有函數成功執行后觸發事件
this.emit( 'success' );
} else {
this.execArrys[ this.succCount ]( self.run.bind( self ) );
}
this.succCount++;
return this; //鏈一個
};
exports = module.exports = function( arg ){
return new AsyncManager( arg );
}
新聞熱點
疑難解答
圖片精選