つの簡単なNode.js非同期の操作の管理器は共有します.

3127 ワード

最近はnodejsを書くことが多くて、初めの時に出会った非同期の操作は比較的に少ないです.やりたいことは比較的に簡単なので、アプリを調べたら同期があります.手間を省くために直接同期を使ってやりました.
はい非同期を書いて、徐々にこのコードが現れました.
 
  
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 );
}