一個簡單的Node.js異步操作管理器分享
最近寫nodejs比較多,剛開始的時候碰到的異步的操作比較少,因為想做的東西比較簡單,一查api有同步的,為了省事就直接用同步的搞了,慢慢發(fā)現(xiàn)這不是個事呀,好好的異步特性不用,非得用同步的,真囧,并且很多東西木有同步的api的。
好!寫異步的,慢慢的出現(xiàn)了這種代碼。。。
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
});
});
});
});
});
});
恩,你也看到了,這樣下去代碼多丑,會像老太太的裹腳布一樣了,于是就產(chǎn)生下面的異步操作管理器,小巧精致,嘿嘿,絕對夠用,代碼的事,用代碼說話吧,直接亮代碼,如碼:
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() //執(zhí)行
* .on('success', function(){
* allThings_is_down();
* });
*
* push方法接受數(shù)組
*/
function typeOf( obj ){
return Object.prototype.toString.call( obj ).match(/\[object ([^\]]*)\]/)[1];
}
function AsyncManager( arg ){
this.execArrys = [];
this.push( arg );
}
//使用系統(tǒng)帶的繼承方法
require('util').inherits( AsyncManager, require('events').EventEmitter );
//標記成功運行的函數(shù)數(shù)目
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; //鏈一個
};
//執(zhí)行
AsyncManager.prototype.run = function(){
var self = this;
if( this.succCount == this.execArrys.length ) {
//所有函數(shù)成功執(zhí)行后觸發(fā)事件
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 );
}
相關(guān)文章
用最簡單的方法判斷JavaScript中this的指向(推薦)
都說 JavaScript 是一種很靈活的語言,這其實也可以說它是一個混亂的語言,下面通過本文給大家分享JavaScript中this的指向知識,感興趣的朋友一起看看吧2017-09-09實現(xiàn)只能輸入數(shù)字的input不用replace方法
只能輸入數(shù)字在以往都是使用replace方法實現(xiàn)的,在本文你將學習到不使用它依然可以實現(xiàn),具體代碼如下,感興趣的朋友可以參考下2013-09-09JS實現(xiàn)帶關(guān)閉功能的阿里媽媽網(wǎng)站頂部滑出banner工具條代碼
這篇文章主要介紹了JS實現(xiàn)帶關(guān)閉功能的阿里媽媽網(wǎng)站頂部滑出banner工具條代碼,可實現(xiàn)頂部banner窗口的浮動顯示及關(guān)閉隱藏功能,具有一定參考借鑒價值,需要的朋友可以參考下2015-09-09