一个简单的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 select控制插件
Aug 17 Javascript
javascript 随机展示头像实现代码
Dec 06 Javascript
JavaScript实现统计文本框Textarea字数增强用户体验
Dec 21 Javascript
完美解决AJAX跨域问题
Nov 01 Javascript
ext combobox动态加载数据库数据(附前后台)
Jun 17 Javascript
javascript简单实现图片预加载
Dec 03 Javascript
JS实现适合于后台使用的动画折叠菜单效果
Sep 21 Javascript
JS求解三元一次方程组值的方法
Jan 03 Javascript
javascript常用的设计模式
Feb 09 Javascript
vuejs2.0实现分页组件使用$emit进行事件监听数据传递的方法
Feb 22 Javascript
jquery手机触屏滑动拼音字母城市选择器的实例代码
Dec 11 jQuery
原生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 5.0对象模型深度探索之绑定
2006/09/05 PHP
解析关于java,php以及html的所有文件编码与乱码的处理方法汇总
2013/06/24 PHP
Thinkphp5+plupload实现的图片上传功能示例【支持实时预览】
2019/05/08 PHP
Laravel 手动开关 Eloquent 修改器的操作方法
2019/12/30 PHP
javascript OFFICE控件测试代码
2009/12/08 Javascript
购物车选中得到价格实现示例
2014/01/26 Javascript
对Jquery中的ajax再封装,简化操作示例
2014/02/12 Javascript
用js闭包的方法实现多点标注冒泡示例
2014/05/29 Javascript
node.js中的fs.rmdir方法使用说明
2014/12/16 Javascript
js实现的倒计时按钮实例
2015/06/24 Javascript
js实现表单Radio切换效果的方法
2015/08/17 Javascript
JavaScript+html5 canvas绘制的小人效果
2016/01/27 Javascript
w3c编程挑战_初级脚本算法实战篇
2017/06/23 Javascript
vue.js学习之vue-cli定制脚手架详解
2017/07/02 Javascript
JS控制鼠标拒绝点击某一按钮的实例
2017/12/29 Javascript
Vue项目中最新用到的一些实用小技巧
2018/11/06 Javascript
如何使用CSS3和JQuery easing 插件制作绚丽菜单
2019/06/18 jQuery
javascript异常处理实现原理详解
2020/02/17 Javascript
详解在IDEA中将Echarts引入web两种方式(使用js文件和maven的依赖导入)
2020/07/11 Javascript
深入浅析Python中join 和 split详解(推荐)
2016/06/30 Python
python去掉行尾的换行符方法
2017/01/04 Python
Python3 使用map()批量的转换数据类型,如str转float的实现
2019/11/29 Python
python 5个顶级异步框架推荐
2020/09/09 Python
Html5实现二维码扫描并解析
2016/01/20 HTML / CSS
英国地毯卖家:The Rug Seller
2019/07/18 全球购物
总裁秘书岗位职责
2013/12/04 职场文书
单位法人授权委托书范本
2014/10/09 职场文书
水电施工员岗位职责
2015/04/11 职场文书
大学生实习介绍信
2015/05/05 职场文书
房屋租赁意向书范本
2015/05/09 职场文书
家长意见和建议怎么写
2015/06/04 职场文书
国庆阅兵观后感
2015/06/15 职场文书
写给汽车4S店的创业计划书,拿来即用!
2019/08/09 职场文书
(开源)微信小程序+mqtt,esp8266温湿度读取
2021/04/02 Javascript
JavaScript 实现页面滚动动画
2021/04/24 Javascript
Python Matplotlib绘制动画的代码详解
2022/05/30 Python