一个简单的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 相关文章推荐
document.compatMode介绍
May 21 Javascript
js实现数组去重、判断数组以及对象中的内容是否相同
Nov 29 Javascript
JQuery中使文本框获得焦点的方法实例分析
Feb 28 Javascript
javascript递归回溯法解八皇后问题
Apr 22 Javascript
谈谈JavaScript中function多重理解
Aug 28 Javascript
jQuery Validate验证表单时多个name相同的元素只验证第一个的解决方法
Dec 24 Javascript
JS+HTML5实现图片在线预览功能
Jul 22 Javascript
详解jenkins自动化部署vue
May 14 Javascript
详解ECMAScript2019/ES10新属性
Dec 06 Javascript
JavaScript字符串转数字的简单实现方法
Nov 27 Javascript
HTML元素拖拽功能实现的完整实例
Dec 04 Javascript
原生jQuery实现只显示年份下拉框
Dec 24 jQuery
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中利用substr_replace将指定两位置之间的字符替换为*号
2011/01/27 PHP
PHP队列用法实例
2014/11/05 PHP
php算法实例分享
2015/07/14 PHP
php获取远程文件内容的函数
2015/11/02 PHP
PHP实现微信申请退款功能
2018/10/01 PHP
ExtJS PropertyGrid中使用Combobox选择值问题
2010/06/13 Javascript
javascript中检测变量的类型的代码
2010/12/28 Javascript
javascript中的继承实例代码
2011/04/27 Javascript
jquery搜索框效果实现方法
2015/01/16 Javascript
jquery实现搜索框常见效果的方法
2015/01/22 Javascript
JavaScript实现显示函数调用堆栈的方法
2016/04/21 Javascript
web 前端常用组件之Layer弹出层组件
2016/09/22 Javascript
vue开发调试神器vue-devtools使用详解
2017/07/13 Javascript
JavaScript自执行函数和jQuery扩展方法详解
2017/10/27 jQuery
js实现关闭网页出现是否离开提示
2017/12/07 Javascript
vue中使用带隐藏文本信息的图片、图片水印的方法
2020/04/24 Javascript
javascript canvas时钟模拟器
2020/07/13 Javascript
解决vue数据不实时更新的问题(数据更改了,但数据不实时更新)
2020/10/27 Javascript
Python实现的简单发送邮件脚本分享
2014/11/07 Python
教你使用python画一朵花送女朋友
2018/03/29 Python
python3 selenium 切换窗口的几种方法小结
2018/05/21 Python
python默认参数调用方法解析
2020/02/09 Python
python查看矩阵的行列号以及维数方式
2020/05/22 Python
Python如何读写CSV文件
2020/08/13 Python
PyCharm设置注释字体颜色以及是否倾斜的操作
2020/09/16 Python
聊聊python在linux下与windows下导入模块的区别说明
2021/03/03 Python
一家专门经营包包的英国网站:MyBag
2019/09/08 全球购物
Marc O’Polo俄罗斯官方在线商店:德国高端时尚品牌
2019/12/26 全球购物
天逸系统(武汉)有限公司Java笔试题
2015/12/29 面试题
数据库专业英语
2012/11/30 面试题
Unix里面如何在后台运行程序
2016/10/14 面试题
财务管理职业生涯规划范文
2013/12/27 职场文书
旅游管理专业大学生职业规划书
2014/02/27 职场文书
团队拓展活动总结
2014/08/27 职场文书
普通话演讲稿
2014/09/03 职场文书
店长岗位职责
2015/02/11 职场文书