一个简单的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 相关文章推荐
javascript 使td内容不换行不撑开
Nov 29 Javascript
node.js中的querystring.parse方法使用说明
Dec 10 Javascript
JQuery插件ajaxfileupload.js异步上传文件实例
May 19 Javascript
jQuery实现tab选项卡效果的方法
Jul 08 Javascript
JavaScript函数内部属性和函数方法实例详解
Mar 17 Javascript
js获取元素的外链样式的简单实现方法
Jun 06 Javascript
JS基于递归实现网页版计算器的方法分析
Dec 20 Javascript
微信小程序js文件改变参数并在视图上及时更新【推荐】
Jun 11 Javascript
JS 中可以提升幸福度的小技巧(可以识别更多另类写法)
Jul 28 Javascript
微信小程序如何获取用户收货地址
Nov 27 Javascript
vue-cli 为项目设置别名的方法
Oct 15 Javascript
Javascript中window.name属性详解
Nov 19 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 session 预定义数组
2009/03/16 PHP
php的POSIX 函数以及进程测试的深入分析
2013/06/03 PHP
php中Socket创建与监听实现方法
2015/01/05 PHP
smarty内置函数capture用法分析
2015/01/22 PHP
php查看一个变量的占用内存的实例代码
2020/03/29 PHP
javascript学习笔记(一) 在html中使用javascript
2012/06/18 Javascript
js调用webservice中的方法实现思路及代码
2013/02/25 Javascript
jquery弹出关闭遮罩层实例
2013/08/06 Javascript
jquery获取URL中参数解决中文乱码问题的两种方法
2013/12/18 Javascript
javascript中attribute和property的区别详解
2014/06/05 Javascript
实例详解JavaScript获取链接参数的方法
2016/01/01 Javascript
jQuery配合coin-slider插件制作幻灯片效果的流程解析
2016/05/13 Javascript
javascript 内置对象及常见API详细介绍
2016/11/01 Javascript
jQuery EasyUI Accordion可伸缩面板组件使用详解
2017/02/28 Javascript
Angular使用$http.jsonp发送跨站请求的方法
2017/03/16 Javascript
详解ElementUI之表单验证、数据绑定、路由跳转
2017/06/21 Javascript
React Native 集成jpush-react-native的示例代码
2017/08/16 Javascript
浅谈Webpack 持久化缓存实践
2018/03/22 Javascript
JS原生带缩略图的图片切换效果
2018/10/10 Javascript
史上最为详细的javascript继承(推荐)
2019/05/18 Javascript
继承行为在 ES5 与 ES6 中的区别详解
2019/12/24 Javascript
深入了解Vue.js 混入(mixins)
2020/07/23 Javascript
vuecli项目构建SSR服务端渲染的实现
2020/10/30 Javascript
[01:23]2014DOTA2国际邀请赛 球迷无处不在Ti现场世界杯受关注
2014/07/10 DOTA
python中定义结构体的方法
2013/03/04 Python
python实现多层感知器MLP(基于双月数据集)
2019/01/18 Python
python将四元数变换为旋转矩阵的实例
2019/12/04 Python
selenium设置浏览器为headless无头模式(Chrome和Firefox)
2021/01/08 Python
Woolworth官网:澳洲第一大超市
2017/06/25 全球购物
迪士尼法国在线商店:shopDisney FR
2020/12/03 全球购物
施工人员岗位职责
2013/12/12 职场文书
广告设计应届生求职信
2014/03/01 职场文书
2014离婚协议书范文(3篇)
2014/11/29 职场文书
2015年元旦主持词开场白
2014/12/14 职场文书
html form表单基础入门案例讲解
2021/07/15 HTML / CSS
Java 在线考试云平台的实现
2021/11/23 Java/Android