一个简单的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 相关文章推荐
表单验证的完整应用案例探讨
Mar 29 Javascript
编写js扩展方法判断一个数组中是否包含某个元素
Nov 08 Javascript
jquery根据name属性查找的小例子
Nov 21 Javascript
jQuery中parents()和parent()的区别分析
Oct 28 Javascript
Node.js的npm包管理器基础使用教程
May 26 Javascript
JavaScript实现输入框与清空按钮联动效果
Sep 09 Javascript
JS实现倒计时(天数、时、分、秒)
Nov 16 Javascript
node.js操作mysql简单实例
May 25 Javascript
浅谈angular2 组件的生命周期钩子
Aug 12 Javascript
vue 动态修改a标签的样式的方法
Jan 18 Javascript
es6 filter() 数组过滤方法总结
Apr 03 Javascript
js绘制一条直线并旋转45度
Aug 21 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
PHP下判断网址是否有效的代码
2011/10/08 PHP
MySql数据库查询结果用表格输出PHP代码示例
2015/03/20 PHP
PHP+MYSQL中文乱码问题
2015/07/01 PHP
3种php生成唯一id的方法
2015/11/23 PHP
php禁用cookie后session设置方法分析
2016/10/19 PHP
JS类的封装及实现代码
2009/12/02 Javascript
使用jQuery validate 验证注册表单实例演示
2013/03/25 Javascript
javascript根据像素点取位置示例
2014/01/27 Javascript
用javascript将数据导入Excel示例代码
2014/09/10 Javascript
JS+CSS实现可拖拽的漂亮圆角特效弹出层完整实例
2015/02/13 Javascript
JS实现让网页背景图片斜向移动的方法
2015/02/25 Javascript
js获取当前日期时间及其它操作汇总
2015/04/17 Javascript
基于jQuery和Bootstrap框架实现仿知乎前端动态列表效果
2016/11/09 Javascript
underscore之function_动力节点Java学院整理
2017/07/11 Javascript
jQuery DOM节点的遍历方法小结
2017/08/15 jQuery
js判断文件类型大小并给出提示的实现方法
2018/01/03 Javascript
vue 实现左右拖拽元素并且不超过他的父元素的宽度
2018/11/30 Javascript
加快Vue项目的开发速度的方法
2018/12/12 Javascript
Three.JS实现三维场景
2018/12/30 Javascript
Python中optparse模块使用浅析
2015/01/01 Python
Python中遇到的小问题及解决方法汇总
2017/01/11 Python
Python基于回溯法子集树模板解决选排问题示例
2017/09/07 Python
数据清洗--DataFrame中的空值处理方法
2018/07/03 Python
Python docx库用法示例分析
2019/02/16 Python
python3.6根据m3u8下载mp4视频
2019/06/17 Python
Python开发之基于模板匹配的信用卡数字识别功能
2020/01/13 Python
Python中求对数方法总结
2020/03/10 Python
pycharm激活方法到2099年(激活流程)
2020/09/22 Python
Sunglass Hut巴西网上商店:男女太阳镜
2020/10/04 全球购物
校园创业策划书
2014/01/14 职场文书
大学生旷课检讨书
2014/01/22 职场文书
设计师个人求职信范文
2014/02/02 职场文书
父母寄语大全
2014/04/12 职场文书
小学生2014国庆节演讲稿:祖国在我心中
2014/09/21 职场文书
期末个人总结范文
2015/02/13 职场文书
2019财务管理制度最新范本!
2019/07/09 职场文书