一个简单的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 相关文章推荐
js实现运行代码需要刷新的解决方法
Aug 18 Javascript
Javascript !!的作用
Dec 04 Javascript
javascript showModalDialog 内跳转页面的问题
Nov 25 Javascript
jquery动态添加option示例
Dec 30 Javascript
JS判断两个时间大小的示例代码
Jan 28 Javascript
jquery事件preventDefault()方法用法实例
Jan 16 Javascript
JavaScript中getUTCSeconds()方法的使用详解
Jun 11 Javascript
JavaScript中利用jQuery绑定事件的几种方式小结
Mar 06 Javascript
纯JS实现弹性导航条效果
Mar 06 Javascript
JS实现禁止用户使用Ctrl+鼠标滚轮缩放网页的方法
Apr 28 Javascript
JavaScript中立即执行函数实例详解
Nov 04 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
让你同时上传 1000 个文件 (二)
2006/10/09 PHP
php实现批量压缩图片文件大小的脚本
2014/07/04 PHP
php给图片添加文字水印方法汇总
2015/08/27 PHP
php上传大文件失败的原因及应对策略
2015/10/20 PHP
Zend Framework教程之路由功能Zend_Controller_Router详解
2016/03/07 PHP
Laravel与CI框架中截取字符串函数
2016/05/08 PHP
js点击页面其它地方将某个显示的DIV隐藏
2012/07/12 Javascript
javascript测试题练习代码
2012/10/10 Javascript
jQuery实现随意改变div任意属性的名称和值(部分原生js实现)
2013/05/28 Javascript
JSON 数字排序多字段排序介绍
2013/09/18 Javascript
Javasipt:操作radio标签详解
2013/12/30 Javascript
动态加载脚本提升javascript性能
2014/02/24 Javascript
JavaScript中数组添加值和访问值常见问题
2016/02/06 Javascript
20170918 前端开发周报之JS前端开发必看
2017/09/18 Javascript
原生javascript实现的全屏滚动功能示例
2017/09/19 Javascript
python数据类型_字符串常用操作(详解)
2017/05/30 Python
Python爬虫实例爬取网站搞笑段子
2017/11/08 Python
python+matplotlib绘制3D条形图实例代码
2018/01/17 Python
使用Python进行AES加密和解密的示例代码
2018/02/02 Python
Centos7 Python3下安装scrapy的详细步骤
2018/03/15 Python
使用Python来开发微信功能
2018/06/13 Python
Python获取基金网站网页内容、使用BeautifulSoup库分析html操作示例
2019/06/04 Python
Python3操作读写CSV文件使用包过程解析
2020/04/10 Python
Python内存泄漏和内存溢出的解决方案
2020/09/26 Python
HTML5梦幻之旅——炫丽的流星雨效果实现过程
2013/08/06 HTML / CSS
命名空间(namespace)和程序集(Assembly)有什么区别
2015/09/25 面试题
运动会通讯稿500字
2014/02/20 职场文书
房产公证书范本
2014/04/10 职场文书
幼儿园小班评语大全
2014/04/17 职场文书
市场策划求职信
2014/08/07 职场文书
2015年城管个人工作总结
2015/05/15 职场文书
小学生运动会广播
2015/08/19 职场文书
团队拓展训练心得体会
2016/01/12 职场文书
「约定的梦幻岛」作画发布诺曼生日新绘
2022/03/21 日漫
MySQL 语句执行顺序举例解析
2022/06/05 MySQL
win10如何开启ahci模式?win10开启ahci模式详细操作教程
2022/07/23 数码科技