欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

一個簡單的Node.js異步操作管理器分享

 更新時間:2014年04月29日 10:37:38   作者:  
這篇文章主要介紹了一個簡單的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)文章

最新評論