一个简单的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 相关文章推荐
ASP中Sub和Function的区别说明
Aug 30 Javascript
js点击选择文本的方法
Feb 09 Javascript
jQuery找出网页上最高元素的方法
Mar 20 Javascript
JavaScript生成.xls文件的代码
Dec 22 Javascript
基于JavaScript实现熔岩灯效果导航菜单
Jan 04 Javascript
微信小程序 开发之滑块视图容器(swiper)详解及实例代码
Feb 22 Javascript
AngularJS基于provider实现全局变量的读取和赋值方法
Jun 28 Javascript
angularjs通过过滤器返回超链接的方法
Oct 26 Javascript
微信小程序开发实现的选项卡(窗口顶部/底部TabBar)页面切换功能图文详解
May 14 Javascript
JS document对象简单用法完整示例
Jan 14 Javascript
js实现贪吃蛇小游戏(加墙)
Jul 31 Javascript
解决pycharm双击但是无法打开的情况
Oct 31 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
2020年4月新番动漫目录 官方宣布4月播出的作品一览
2020/03/08 日漫
PHP程序员最常犯的11个MySQL错误小结
2010/11/20 PHP
PHP session文件独占锁引起阻塞问题解决方法
2015/05/12 PHP
比较详细的javascript对象的property和prototype是什么一种关系
2007/08/06 Javascript
web前端开发也需要日志
2010/12/09 Javascript
《JavaScript高级编程》学习笔记之object和array引用类型
2015/11/01 Javascript
Node.js编写组件的三种实现方式
2016/02/25 Javascript
基于JavaScript实现文字超出部分隐藏
2016/02/29 Javascript
Javascript字符串常用方法详解
2016/07/21 Javascript
正则中的回溯定义与用法分析【JS与java实现】
2016/12/27 Javascript
vue.js事件处理器是什么
2017/03/20 Javascript
javascript实现二叉树的代码
2017/06/08 Javascript
基于node.js之调试器详解
2017/08/22 Javascript
vue自定义filters过滤器
2018/04/26 Javascript
jQuery实现table表格信息的展开和缩小功能示例
2018/07/21 jQuery
JS如何获取地址栏的参数实例讲解
2018/10/06 Javascript
解决vue v-for src 图片路径问题 404
2019/11/12 Javascript
[02:57]DOTA2英雄基础教程 风行者
2014/01/16 DOTA
Python3利用SMTP协议发送E-mail电子邮件的方法
2017/09/30 Python
Python使用Dijkstra算法实现求解图中最短路径距离问题详解
2018/05/16 Python
Python定时发送消息的脚本:每天跟你女朋友说晚安
2018/10/21 Python
Python 批量刷博客园访问量脚本过程解析
2019/08/30 Python
python用pip install时安装失败的一系列问题及解决方法
2020/02/24 Python
python集合能干吗
2020/07/19 Python
使用CSS3的背景渐变Text Gradient 创建文字颜色渐变
2014/08/19 HTML / CSS
CSS3制作缩略图的详细过程
2016/07/08 HTML / CSS
html5 Canvas画图教程(7)—canvas里画曲线之quadraticCurveTo方法
2013/01/09 HTML / CSS
新西兰领先的鞋类和靴子网上商城:Merchant 1948
2017/09/08 全球购物
接口中的方法可以是abstract的吗
2015/07/23 面试题
应付会计岗位职责
2013/12/12 职场文书
大学活动总结模板
2014/07/10 职场文书
2014感恩节演讲稿大全
2014/10/11 职场文书
乡镇干部学习心得体会
2016/01/23 职场文书
JavaScript的function函数详细介绍
2021/11/20 Javascript
JavaScript实现两个数组的交集
2022/03/25 Javascript
科学家研发出新型速效酶,可在 24 小时内降解塑料制品
2022/04/29 数码科技