一个简单的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 相关文章推荐
javascript firefox不显示本地预览图片问题的解决方法
Nov 12 Javascript
Javascript var变量隐式声明方法
Oct 19 Javascript
js网页侧边随页面滚动广告效果实现
Apr 14 Javascript
JavaScript 放大镜 移动镜片效果代码
May 09 Javascript
利用了jquery的ajax实现二级联互动菜单
Dec 02 Javascript
JS字符串截取函数实例
Dec 27 Javascript
JavaScript你不知道的一些数组方法
Aug 18 Javascript
Vue使用vue-area-linkage实现地址三级联动效果的示例
Jun 27 Javascript
详解小程序缓存插件(mrc)
Aug 17 Javascript
详解JavaScript中关于this指向的4种情况
Apr 18 Javascript
如何通过JS实现转码与解码
Feb 21 Javascript
javascript设计模式 ? 解释器模式原理与用法实例分析
Apr 17 Javascript
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
给ECShop添加最新评论
2015/01/07 PHP
php递归法读取目录及文件的方法
2015/01/30 PHP
PHP jQuery+Ajax结合写批量删除功能
2017/05/19 PHP
thinkphp5 migrate数据库迁移工具
2018/02/20 PHP
ASP.NET jQuery 实例2 (表单中使用回车在TextBox之间向下移动)
2012/01/13 Javascript
如何获取JQUERY AJAX返回的JSON结果集实现代码
2012/12/10 Javascript
jQuery的live()方法对hover事件的处理示例
2014/02/27 Javascript
JavaScript参数个数可变的函数举例说明
2014/10/10 Javascript
js实现用户离开页面前提示是否离开此页面的方法(包括浏览器按钮事件)
2015/07/18 Javascript
JavaScript实现打开链接页面的方式汇总
2016/06/02 Javascript
浅谈JS继承_借用构造函数 & 组合式继承
2016/08/16 Javascript
Angular2 (RC4) 路由与导航详解
2016/09/21 Javascript
jQuery布局组件EasyUI Layout使用方法详解
2017/02/28 Javascript
express框架实现基于Websocket建立的简易聊天室
2017/08/10 Javascript
node中使用es5/6以及支持性与性能对比
2017/08/11 Javascript
layui 给数据表格加序号的方法
2018/08/20 Javascript
浅谈Vue.js 关于页面加载完成后执行一个方法的问题
2019/04/01 Javascript
layui 实现表单和文件上传一起传到后台的例子
2019/09/16 Javascript
python实现简单socket程序在两台电脑之间传输消息的方法
2015/03/13 Python
Python每天必学之bytes字节
2016/01/28 Python
Python初学者常见错误详解
2019/07/02 Python
python 列表推导式使用详解
2019/08/29 Python
Pycharm+Python+PyQt5使用详解
2019/09/25 Python
Pytorch Tensor的统计属性实例讲解
2019/12/30 Python
使用pyhon绘图比较两个手机屏幕大小(实例代码)
2020/01/03 Python
如何使用python的ctypes调用医保中心的dll动态库下载医保中心的账单
2020/05/24 Python
浅谈TensorFlow中读取图像数据的三种方式
2020/06/30 Python
python爬虫中抓取指数的实例讲解
2020/12/01 Python
使用Html5、CSS实现文字阴影效果
2018/01/17 HTML / CSS
Redbubble法国:由独立艺术家设计的独特产品
2019/01/08 全球购物
吸烟检讨书2000字
2014/02/13 职场文书
工程学毕业生自荐信
2014/06/14 职场文书
公司委托书范本5篇
2014/09/20 职场文书
党员个人总结范文
2015/02/14 职场文书
护士自荐信怎么写
2015/03/06 职场文书
简述Java中throw-throws异常抛出
2021/08/07 Java/Android