一个简单的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使用CSS()方法给指定元素同时设置多个样式
Mar 26 Javascript
jQuery简单创建节点的方法
Sep 09 Javascript
Jquery-data的三种用法
Apr 18 jQuery
js + css实现标签内容切换功能(实例讲解)
Oct 09 Javascript
JS异步函数队列功能实例分析
Nov 28 Javascript
深入浅析JSONAPI在PHP中的应用
Dec 24 Javascript
使用bootstrap实现下拉框搜索功能的实例讲解
Aug 10 Javascript
Vue.directive使用注意(小结)
Aug 31 Javascript
解决vue2 在mounted函数无法获取prop中的变量问题
Nov 15 Javascript
原生js代码能实现call和bind吗
Jul 31 Javascript
vue实现简单加法计算器
Oct 22 Javascript
Vuex实现简单购物车
Jan 10 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
一个显示效果非常不错的PHP错误、异常处理类
2014/03/21 PHP
9个实用的PHP代码片段分享
2015/01/22 PHP
js函数使用技巧之 setTimeout(function(){},0)
2009/02/09 Javascript
解读JavaScript代码 var ie = !-[1,] 最短的IE判定代码
2011/05/28 Javascript
我的Node.js学习之路(二)NPM模块管理
2014/07/06 Javascript
Node.js中创建和管理外部进程详解
2014/08/16 Javascript
jQuery之Deferred对象详解
2014/09/04 Javascript
jQuery表格行上移下移和置顶的实现方法
2015/10/08 Javascript
Node.js中防止错误导致的进程阻塞的方法
2016/08/11 Javascript
JavaScript  event对象整理及详细介绍
2016/10/10 Javascript
微信小程序开发一键登录 获取session_key和openid实例
2016/11/23 Javascript
解析微信JS-SDK配置授权,实现分享接口
2016/12/09 Javascript
Vue.js常用指令的使用小结
2017/06/23 Javascript
用vue构建多页面应用的示例代码
2017/09/20 Javascript
vue对storejs获取的数据进行处理时遇到的几种问题小结
2018/03/20 Javascript
node.js中process进程的概念和child_process子进程模块的使用方法示例
2020/02/11 Javascript
浅析JS中NEW的实现原理及重写
2020/02/20 Javascript
JavaScript实现指定数量的并发限制的示例代码
2020/03/10 Javascript
[01:07:20]DOTA2-DPC中国联赛 正赛 Dynasty vs XG BO3 第二场 2月2日
2021/03/11 DOTA
python中self原理实例分析
2015/04/30 Python
Python编程实现的简单Web服务器示例
2017/06/22 Python
Python爬虫框架Scrapy常用命令总结
2018/07/26 Python
python实现栅栏加解密 支持密钥加密
2019/03/20 Python
python opencv 批量改变图片的尺寸大小的方法
2019/06/28 Python
python实现加密的方式总结
2020/01/19 Python
如何安装并在pycharm使用selenium的方法
2020/04/30 Python
CSS3动画之利用requestAnimationFrame触发重新播放功能
2019/09/11 HTML / CSS
CSS3的 fit-content实现水平居中
2017/09/07 HTML / CSS
美国山地自行车、露营、户外装备和服装购物网站:Aventuron
2018/05/05 全球购物
八年级语文教学反思
2014/02/11 职场文书
公益广告语集锦
2014/03/13 职场文书
大专生自荐书范文
2014/06/22 职场文书
领导干部作风建设工作总结
2014/10/23 职场文书
班主任先进事迹材料
2014/12/17 职场文书
2015年世界粮食日演讲稿
2015/03/20 职场文书
2015年七一建党节活动总结
2015/03/20 职场文书