一个简单的Node.js异步操作管理器分享


Posted in Javascript onApril 29, 2014

最近写nodejs比较多,刚开始的时候碰到的异步的操作比较少,因为想做的东西比较简单,一查api有同步的,为了省事就直接用同步的搞了,慢慢发现这不是个事呀,好好的异步特性不用,非得用同步的,真?澹?⑶液芏喽?髂居型?降?pi的。

好!写异步的,慢慢的出现了这种代码。。。

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

 

Javascript 相关文章推荐
汉化英文版的Dreamweaver CS5并自动提示jquery
Nov 25 Javascript
node.js中的path.delimiter方法使用说明
Dec 09 Javascript
创建一个类Person的简单实例
May 17 Javascript
微信小程序 时间格式化(util.formatTime(new Date))详解
Nov 16 Javascript
js的函数的按值传递参数(实例讲解)
Nov 16 Javascript
Vue的watch和computed方法的使用及区别介绍
Sep 06 Javascript
在Express中提供静态文件的实现方法
Oct 17 Javascript
JavaScript交换两个变量方法实例
Nov 25 Javascript
JS实现滑动导航效果
Jan 14 Javascript
JavaScript中window和document用法详解
Jul 28 Javascript
在vue中使用回调函数,this调用无效的解决
Aug 11 Javascript
Vue-router中hash模式与history模式的区别详解
Dec 15 Vue.js
IE浏览器中图片onload事件无效的解决方法
Apr 29 #Javascript
javascript的创建多行字符串的7种方法
Apr 29 #Javascript
Javascript实现的常用算法(如冒泡、快速、鸽巢、奇偶等)
Apr 29 #Javascript
当某个文本框成为焦点时即清除文本框内容
Apr 28 #Javascript
JS实现两个大数(整数)相乘
Apr 28 #Javascript
关于img的href和src取变量及赋值的方法
Apr 28 #Javascript
php和js对数据库图片进行等比缩放示例
Apr 28 #Javascript
You might like
农民和部队如何穿矿
2020/03/04 星际争霸
咖啡冲泡指南 咖啡有哪些制作方式 单品咖啡 意式咖啡
2021/03/06 冲泡冲煮
PHP生成Flash动画的实现代码
2010/03/12 PHP
刷新PHP缓冲区为你的站点加速
2015/10/10 PHP
PHP 中 Orientation 属性判断上传图片是否需要旋转
2015/10/16 PHP
PHP实现广度优先搜索算法(BFS,Broad First Search)详解
2017/09/16 PHP
PHP PDOStatement::fetchColumn讲解
2019/01/31 PHP
javascript 鼠标滚轮事件
2009/04/09 Javascript
JavaScript 关键字屏蔽实现函数
2009/08/02 Javascript
javascript 循环读取JSON数据的代码
2010/07/17 Javascript
javascript动态修改Li节点值的方法
2015/01/20 Javascript
JS的数组迭代方法
2015/02/05 Javascript
Spring mvc 接收json对象
2015/12/10 Javascript
jquery获取form表单input元素值的简单实例
2016/05/30 Javascript
SelecT下拉框选中和取值的解决方法
2016/11/22 Javascript
bootstrap输入框组使用方法
2017/02/07 Javascript
JS中如何实现Laravel的route函数详解
2017/02/12 Javascript
bootstrap-table实现表头固定以及列固定的方法示例
2019/03/07 Javascript
vue 项目build错误异常的解决方法
2019/04/22 Javascript
JS FormData对象使用方法实例详解
2020/02/12 Javascript
Python环境搭建之OpenCV的步骤方法
2017/10/20 Python
Python制作豆瓣图片的爬虫
2017/12/28 Python
Python使用装饰器模拟用户登陆验证功能示例
2018/08/24 Python
python遍历文件夹找出文件夹后缀为py的文件方法
2018/10/21 Python
如何在python中实现随机选择
2019/11/02 Python
python-视频分帧&多帧合成视频实例
2019/12/10 Python
pytorch中的weight-initilzation用法
2020/06/24 Python
html5服务器推送_动力节点Java学院整理
2017/07/12 HTML / CSS
荷兰在线啤酒店:Beerwulf
2019/08/26 全球购物
英国性能汽车零件和发动机配件在线:Maxpeedingrods
2019/11/05 全球购物
二手房购房意向书范本
2014/04/01 职场文书
中学优秀班主任事迹材料
2014/05/01 职场文书
六查六看自查报告
2014/10/14 职场文书
营销经理工作检讨书
2014/11/03 职场文书
运动会100米广播稿
2015/08/19 职场文书
使用refresh_token实现无感刷新页面
2022/04/26 Javascript