一个简单的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 innerHTML、outerHTML、innerText、outerText的区别
Nov 24 Javascript
基于jquery的合并table相同单元格的插件(精简版)
Apr 05 Javascript
深入了解Node.js中的一些特性
Sep 25 Javascript
JavaScript常用的返回,自动跳转,刷新,关闭语句汇总
Jan 13 Javascript
利用jquery实现验证输入的是否是数字、小数,包含保留几位小数
Dec 07 Javascript
JQuery实现图片轮播效果
May 08 jQuery
JS失效 提示HTML1114: (UNICODE 字节顺序标记)的代码页 utf-8 覆盖(META 标记)的冲突的代码页 utf-8
Jun 23 Javascript
Jquery遍历筛选数组的几种方法和遍历解析json对象,Map()方法详解以及数组中查询某值是否存在
Jan 18 jQuery
JS获取动态添加元素的方法详解
Jul 31 Javascript
JS实现简单日历特效
Jan 03 Javascript
VSCode搭建React Native环境
May 07 Javascript
vue实现打地鼠小游戏
Aug 21 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.NET的入门教程
2006/10/09 PHP
php 无限级 SelectTree 类
2009/05/19 PHP
str_replace只替换一次字符串的方法
2013/04/09 PHP
php检测网页是否被百度收录的函数代码
2013/10/09 PHP
微信支付开发发货通知实例
2016/07/12 PHP
Js+Dhtml:WEB程序员简易开发工具包(预先体验版)
2006/11/07 Javascript
List Information About the Binary Files Used by an Application
2007/06/18 Javascript
javascript中创建对象的三种常用方法
2010/12/30 Javascript
json数据与字符串的相互转化示例
2013/09/18 Javascript
JS的事件绑定深入认识
2014/06/26 Javascript
如何实现json数据可视化详解
2016/11/24 Javascript
详解NodeJS框架express的路径映射(路由)功能及控制
2017/03/24 NodeJs
浅谈AngularJS中使用$resource(已更新)
2017/09/14 Javascript
Swiper实现导航栏滚动效果
2020/10/16 Javascript
JavaScript 实现继承的几种方式
2021/02/19 Javascript
[01:36]极致酷炫!TI9典藏宝瓶+撼地者至宝展示
2019/06/11 DOTA
用Python实现服务器中只重载被修改的进程的方法
2015/04/30 Python
pandas将DataFrame的列变成行索引的方法
2018/04/10 Python
Python使用ctypes调用C/C++的方法
2019/01/29 Python
pymongo中group by的操作方法教程
2019/03/22 Python
Python (Win)readline和tab补全的安装方法
2019/08/27 Python
python list多级排序知识点总结
2019/10/23 Python
Pycharm新手使用教程(图文详解)
2020/09/17 Python
使用 css3 实现圆形进度条的示例
2017/07/05 HTML / CSS
html5 canvas的绘制文本自动换行的示例代码
2018/09/17 HTML / CSS
WiFi云数码相框:Nixplay
2018/07/05 全球购物
导游的职业规划书范文
2013/12/27 职场文书
刑事代理授权委托书
2014/09/17 职场文书
2014年行风建设工作总结
2014/12/01 职场文书
付款承诺函范文
2015/01/21 职场文书
用电申请报告范文
2015/05/18 职场文书
统招统分证明
2015/06/23 职场文书
2017大学生寒假社会实践心得体会
2016/01/14 职场文书
CSS 文字装饰 text-decoration & text-emphasis 详解
2021/04/06 HTML / CSS
多线程Spring通过@Scheduled实现定时任务
2022/05/25 Java/Android
Python中requests库的用法详解
2022/06/05 Python