一個簡單的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 );
//標(biāo)記成功運行的函數(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 Scoping and Hoisting 翻譯
希望這篇文章能夠給JavaScript程序員最容易困惑的部分一些啟示。我盡力寫的全面,以免引起更多的困惑。如果我寫錯了或是漏掉了某些重要的東西,請一定讓我知道2012-07-07
解決一個微信號同時支持多個環(huán)境網(wǎng)頁授權(quán)問題
由于微信限制一個服務(wù)號只能配置一個網(wǎng)頁授權(quán)域名, 又不可能給每個環(huán)境單獨配一個服務(wù)號,這樣不僅需要成本而且很浪費資源,下面小編給大家?guī)砹私鉀Q一個微信號同時支持多個環(huán)境網(wǎng)頁授權(quán)問題,感興趣的朋友一起看看吧2019-08-08
原生JS實現(xiàn)頂部導(dǎo)航欄顯示按鈕+搜索框功能
這篇文章主要介紹了原生js實現(xiàn)頂部導(dǎo)航欄顯示按鈕+搜索框功能,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-12-12
javascript設(shè)計模式 – 裝飾模式原理與應(yīng)用實例分析
這篇文章主要介紹了javascript設(shè)計模式 – 裝飾模式,結(jié)合實例形式分析了javascript裝飾模式基本概念、原理、應(yīng)用場景及操作注意事項,需要的朋友可以參考下2020-04-04
讓背景如此暗淡(一種彈出提示信息時頁面背景色調(diào)改變的方法)
讓背景如此暗淡(一種彈出提示信息時頁面背景色調(diào)改變的方法)...2006-10-10

