一个简单的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 相关文章推荐
jquery创建div 实现代码
Apr 27 Javascript
IE8 兼容性问题(属性名区分大小写)
Jun 04 Javascript
javascript getElementsByName()的用法说明
Jul 31 Javascript
在Mac OS下使用Node.js的简单教程
Jun 24 Javascript
简单谈谈json跨域
Mar 13 Javascript
Fullpage.js固定导航栏-实现定位导航栏
Mar 17 Javascript
JavaScript 身份证号有效验证详解及实例代码
Oct 20 Javascript
jQuery实现jQuery-form.js实现异步上传文件
Apr 28 jQuery
bootstrap table表格客户端分页实例
Aug 07 Javascript
基于node.js express mvc轻量级框架实践
Sep 14 Javascript
Angular实现类似博客评论的递归显示及获取回复评论的数据
Nov 06 Javascript
Vue中的作用域CSS和CSS模块的区别
Oct 09 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
星际争霸, 教主第一视角, ZvT经典龙蛇演义
2020/03/02 星际争霸
Smarty日期时间操作方法示例
2016/11/15 PHP
php实现微信模拟登陆、获取用户列表及群发消息功能示例
2017/06/28 PHP
js日历功能对象
2012/01/12 Javascript
JavaScript字符串String和Array操作的有趣方法
2012/12/18 Javascript
Javascript限制网页只能在微信内置浏览器中访问
2014/11/09 Javascript
关于原生js中bind函数的简单实现
2016/08/10 Javascript
Node.js中防止错误导致的进程阻塞的方法
2016/08/11 Javascript
jQuery查找节点方法完整实例
2016/09/13 Javascript
一步一步封装自己的HtmlHelper组件BootstrapHelper(二)
2016/09/14 Javascript
求js数组的最大值和最小值的四种方法
2017/03/03 Javascript
js图片放大镜实例讲解(必看篇)
2017/07/17 Javascript
JS数组实现分类统计实例代码
2018/09/30 Javascript
深入浅析Node.js 事件循环、定时器和process.nextTick()
2018/10/22 Javascript
Vue 中如何正确引入第三方模块的方法步骤
2019/05/05 Javascript
koa2的中间件功能及应用示例
2020/03/05 Javascript
Python translator使用实例
2008/09/06 Python
Python实现包含min函数的栈
2016/04/29 Python
python使用logging模块发送邮件代码示例
2018/01/18 Python
Python学习笔记之open()函数打开文件路径报错问题
2018/04/28 Python
pygame游戏之旅 按钮上添加文字的方法
2018/11/21 Python
Python实现的各种常见分布算法示例
2018/12/13 Python
celery4+django2定时任务的实现代码
2018/12/23 Python
flask/django 动态查询表结构相同表名不同数据的Model实现方法
2019/08/29 Python
python获取栅格点和面值的实现
2020/03/10 Python
python查询MySQL将数据写入Excel
2020/10/29 Python
Jupyter Notebook安装及使用方法解析
2020/11/12 Python
Farfetch阿联酋:奢侈品牌时尚购物平台
2019/07/26 全球购物
巴西24小时在线药房:Drogasil
2020/06/20 全球购物
建议书标准格式
2014/03/12 职场文书
竞争与合作演讲稿
2014/05/12 职场文书
建筑施工安全生产责任书
2014/07/22 职场文书
纺织工程专业推荐信
2014/09/08 职场文书
2014年师德师风工作总结
2014/11/25 职场文书
六年级学生期末评语
2014/12/26 职场文书
Go语言带缓冲的通道实现
2021/04/26 Golang