一个简单的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 validate 中文API 附validate.js中文api手册
Jul 31 Javascript
jquery使用animate方法实现控制元素移动
Mar 27 Javascript
JS+CSS实现带小三角指引的滑动门效果
Sep 22 Javascript
基于jQuery实现动态搜索显示功能
May 05 Javascript
JavaScript正则表达式替换字符串中图片地址(img src)的方法
Jan 13 Javascript
详解在vue-cli中使用路由
Sep 25 Javascript
vue引入js数字小键盘的实现代码
May 14 Javascript
Vue.use源码学习小结
Jun 20 Javascript
微信小程序框架wepy之动态控制类名
Sep 14 Javascript
vue.js 子组件无法获取父组件store值的解决方式
Nov 08 Javascript
详解微信小程序中var、let、const用法与区别
Jan 11 Javascript
ant design vue datepicker日期选择器中文化操作
Oct 28 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数组声明、遍历、数组全局变量使用小结
2013/06/05 PHP
PHPMailer发送HTML内容、带附件的邮件实例
2014/07/01 PHP
thinkphp整合微信支付代码分享
2016/11/24 PHP
Js操作树节点自动折叠展开的几种方法
2014/05/05 Javascript
jquery+php实现搜索框自动提示
2014/11/28 Javascript
了解Javascript的模块化开发
2015/03/02 Javascript
浅谈javascript中call()、apply()、bind()的用法
2015/04/20 Javascript
js判断手机号运营商的方法
2015/10/23 Javascript
深入理解Angularjs中$http.post与$.post
2017/05/19 Javascript
jquery 键盘事件的使用方法详解
2017/09/13 jQuery
详谈commonjs模块与es6模块的区别
2017/10/18 Javascript
使用 Node.js 模拟滑动拼图验证码操作的示例代码
2017/11/02 Javascript
jQuery实现的简单无刷新评论功能示例
2017/11/08 jQuery
Vue项目webpack打包部署到Tomcat刷新报404错误问题的解决方案
2018/05/15 Javascript
vue服务端渲染页面缓存和组件缓存的实例详解
2018/09/18 Javascript
cdn模式下vue的基本用法详解
2018/10/07 Javascript
vue input标签通用指令校验的实现
2019/11/05 Javascript
JavaScript ECMA-262-3 深入解析(二):变量对象实例详解
2020/04/25 Javascript
解决vue2中使用elementUi打包报错的问题
2020/09/22 Javascript
js 将多个对象合并成一个对象 assign方法的实现
2020/09/24 Javascript
进一步探究Python中的正则表达式
2015/04/28 Python
Python中将字典转换为XML以及相关的命名空间解析
2015/10/15 Python
python实现二分查找算法
2017/09/21 Python
解决python中使用plot画图,图不显示的问题
2018/07/04 Python
python查看模块安装位置的方法
2018/10/16 Python
python实现趣味图片字符化
2019/04/30 Python
搞清楚 Python traceback的具体使用方法
2019/05/13 Python
余弦相似性计算及python代码实现过程解析
2019/09/18 Python
pyinstaller打包单文件时--uac-admin选项不起作用怎么办
2020/04/15 Python
Python用来做Web开发的优势有哪些
2020/08/05 Python
使用Django的JsonResponse返回数据的实现
2021/01/15 Python
牵手50台湾:专为黄金岁月的单身人士而设的交友网站
2021/02/18 全球购物
什么是Assembly(程序集)
2014/09/14 面试题
公民授权委托书
2014/10/15 职场文书
动画《朋友游戏》公开佐藤友生绘制的开播纪念绘
2022/04/06 日漫
Python测试框架pytest核心库pluggy详解
2022/08/05 Golang