一個(gè)簡單的Node.js異步操作管理器分享
最近寫nodejs比較多,剛開始的時(shí)候碰到的異步的操作比較少,因?yàn)橄胱龅臇|西比較簡單,一查api有同步的,為了省事就直接用同步的搞了,慢慢發(fā)現(xiàn)這不是個(gè)事呀,好好的異步特性不用,非得用同步的,真囧,并且很多東西木有同步的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 );
//標(biāo)記成功運(yùn)行的函數(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; //鏈一個(gè)
};
//執(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; //鏈一個(gè)
};
exports = module.exports = function( arg ){
return new AsyncManager( arg );
}
相關(guān)文章
ES6新特性八:async函數(shù)用法實(shí)例詳解
這篇文章主要介紹了ES6新特性八:async函數(shù)用法,結(jié)合實(shí)例形式分析了async函數(shù)的功能、原理、使用方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下2017-04-04兩種JS實(shí)現(xiàn)屏蔽鼠標(biāo)右鍵的方法
這篇文章主要介紹了兩種JS實(shí)現(xiàn)屏蔽鼠標(biāo)右鍵的方法,瀏覽者在訪問你網(wǎng)頁的時(shí)候就不能點(diǎn)擊右鍵,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2015-08-08javascript中checkbox使用方法實(shí)例演示
這篇文章通過簡單的實(shí)例演示了javascript中checkbox使用方法,感興趣的小伙伴們可以參考一下2015-11-11用最簡單的方法判斷JavaScript中this的指向(推薦)
都說 JavaScript 是一種很靈活的語言,這其實(shí)也可以說它是一個(gè)混亂的語言,下面通過本文給大家分享JavaScript中this的指向知識,感興趣的朋友一起看看吧2017-09-09實(shí)現(xiàn)只能輸入數(shù)字的input不用replace方法
只能輸入數(shù)字在以往都是使用replace方法實(shí)現(xiàn)的,在本文你將學(xué)習(xí)到不使用它依然可以實(shí)現(xiàn),具體代碼如下,感興趣的朋友可以參考下2013-09-09JS實(shí)現(xiàn)帶關(guān)閉功能的阿里媽媽網(wǎng)站頂部滑出banner工具條代碼
這篇文章主要介紹了JS實(shí)現(xiàn)帶關(guān)閉功能的阿里媽媽網(wǎng)站頂部滑出banner工具條代碼,可實(shí)現(xiàn)頂部banner窗口的浮動顯示及關(guān)閉隱藏功能,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-09-09