国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

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

2024-05-06 16:04:47
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了一個簡單的Node.js異步操作管理器分享,需要的朋友可以參考下

最近寫nodejs比較多,剛開始的時候碰到的異步的操作比較少,因為想做的東西比較簡單,一查api有同步的,為了省事就直接用同步的搞了,慢慢發現這不是個事呀,好好的異步特性不用,非得用同步的,真囧,并且很多東西木有同步的api的。

好!寫異步的,慢慢的出現了這種代碼。。。

復制代碼 代碼如下:


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 );
}

 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 安丘市| 义马市| 泌阳县| 南雄市| 嫩江县| 武安市| 平阴县| 册亨县| 无为县| 朝阳县| 怀柔区| 卓资县| 东乌珠穆沁旗| 乐平市| 新宁县| 固原市| 申扎县| 彭泽县| 镇坪县| 泗洪县| 格尔木市| 马龙县| 南靖县| 隆昌县| 当雄县| 札达县| 阿合奇县| 原平市| 南和县| 左权县| 府谷县| 皮山县| 年辖:市辖区| 南昌县| 肇庆市| 荃湾区| 忻州市| 吴旗县| 潮安县| 海丰县| 大同市|