一个简单的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.ui.progressbar 中文文档
Nov 26 Javascript
js中格式化日期时间型数据函数代码
Nov 08 Javascript
JavaScript 字符串处理函数使用小结
Dec 02 Javascript
js中top/parent/frame概述及案例应用
Feb 06 Javascript
jQuery学习笔记(4)--Jquery中获取table中某列值的具体思路
Apr 10 Javascript
js为数字添加逗号并格式化数字的代码
Aug 23 Javascript
Jquery搜索父元素操作方法
Feb 10 Javascript
jQuery基于BootStrap样式实现无限极地区联动
Aug 26 Javascript
详解JSON Web Token 入门教程
Jul 30 Javascript
vue ssr 实现方式(学习笔记)
Jan 18 Javascript
一文了解vue-router之hash模式和history模式
May 31 Javascript
Vue Elenent实现表格相同数据列合并
Nov 30 Vue.js
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
ajax实现无刷新分页(php)
2010/07/18 PHP
Yii2设置默认控制器的两种方法
2017/05/19 PHP
QQ登录简单实现代码
2021/03/09 Javascript
json 定义
2008/06/10 Javascript
Jquery颜色选择器ColorPicker实现代码
2012/11/14 Javascript
js利用数组length属性清空和截短数组的小例子
2014/01/15 Javascript
javascript拖拽应用实例(二)
2016/03/25 Javascript
jQuery基于$.ajax设置移动端click超时处理方法
2016/05/14 Javascript
bootstrap的工具提示实例代码
2017/05/17 Javascript
javascript 取小数点后几位几种方法总结
2017/08/02 Javascript
深入浅析angular和vue还有jquery的区别
2018/08/13 jQuery
jquery 动态遍历select 赋值的实例
2018/09/12 jQuery
详解wepy开发小程序踩过的坑(小结)
2019/05/22 Javascript
npm的lock机制解析
2019/06/20 Javascript
关于Node.js中频繁修改代码重启服务器的问题
2020/10/15 Javascript
vue组件实现移动端九宫格转盘抽奖
2020/10/16 Javascript
[02:01]大师之路——DOTA2完美大师赛11月论剑上海
2017/11/06 DOTA
Python实现的检测web服务器健康状况的小程序
2014/09/17 Python
基于Python实现通过微信搜索功能查看谁把你删除了
2016/01/27 Python
Python 函数基础知识汇总
2018/03/09 Python
Python Unittest自动化单元测试框架详解
2018/04/04 Python
python中matplotlib条件背景颜色的实现
2019/09/02 Python
pycharm通过anaconda安装pyqt5的教程
2020/03/24 Python
python函数超时自动退出的实操方法
2020/12/28 Python
Html5踩坑记之mandMobile使用小记
2020/04/02 HTML / CSS
Too Faced官网:美国知名彩妆品牌
2017/03/07 全球购物
Skyscanner香港:机票比价, 平机票和廉价航空机票预订
2020/02/07 全球购物
一封普通求职者的求职信
2013/11/20 职场文书
精通CAD能手自荐书
2014/01/31 职场文书
《卖木雕的少年》教学反思
2014/04/11 职场文书
大学生村官座谈会发言材料
2014/05/25 职场文书
四风自我剖析材料
2014/09/30 职场文书
出纳工作检讨书范文
2014/12/27 职场文书
实习报告范文
2019/07/30 职场文书
详解RedisTemplate下Redis分布式锁引发的系列问题
2021/04/27 Redis
详细谈谈JavaScript中循环之间的差异
2021/08/23 Javascript