一个简单的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 相关文章推荐
var与Javascript变量隐式声明
Sep 17 Javascript
读jQuery之一(对象的组成)
Jun 11 Javascript
整理Javascript基础语法学习笔记
Nov 29 Javascript
bootstrap table使用入门基本用法
May 24 Javascript
原生JS实现图片懒加载(lazyload)实例
Jun 13 Javascript
vue中使用localstorage来存储页面信息
Nov 04 Javascript
手机注册发送验证码倒计时的简单实例
Nov 15 Javascript
JS实现求5的阶乘示例
Jan 21 Javascript
echarts实现词云自定义形状的示例代码
Feb 20 Javascript
利用Angular7开发一个Radio组件的全过程
Jul 11 Javascript
微信小程序点击图片实现长按预览、保存、识别带参数二维码、转发等功能
Jul 20 Javascript
Vue多选列表组件深入详解
Mar 02 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实现用户认证及管理完全源码
2007/03/11 PHP
php检测网页是否被百度收录的函数代码
2013/10/09 PHP
php基于curl实现随机ip地址抓取内容的方法
2016/10/11 PHP
Laravel5.* 打印出执行的sql语句的方法
2017/07/24 PHP
浅谈PHP实现大流量下抢购方案
2017/12/15 PHP
laravel 数据迁移与 Eloquent ORM的实现方法
2019/04/12 PHP
Yii2框架自定义类统一处理url操作示例
2019/05/25 PHP
JavaScript异步调用定时方法并停止该方法实现代码
2012/03/16 Javascript
解析URI与URL之间的区别与联系
2013/11/22 Javascript
JS判断浏览器是否支持某一个CSS3属性的方法
2014/10/17 Javascript
js实现仿MSN带关闭功能的右下角弹窗代码
2015/09/04 Javascript
JS简单编号生成器实现方法(附demo源码下载)
2016/04/05 Javascript
解析预加载显示图片艺术
2016/12/05 Javascript
javascript导出csv文件(excel)的方法示例
2019/08/25 Javascript
如何在postman中添加cookie信息步骤解析
2020/06/30 Javascript
浅谈js数组splice删除某个元素爬坑
2020/10/14 Javascript
详解JavaScript中分解数字的三种方法
2021/01/05 Javascript
Python实现的科学计算器功能示例
2017/08/04 Python
python with提前退出遇到的坑与解决方案
2018/01/05 Python
Selenium 滚动页面至元素可见的方法
2020/03/18 Python
python opencv实现简易画图板
2020/08/27 Python
python中类与对象之间的关系详解
2020/12/16 Python
乐高官方旗舰店:LEGO积木玩具
2019/04/06 全球购物
开朗女孩的自我评价
2014/02/10 职场文书
创建省级文明单位实施方案
2014/02/27 职场文书
党支部承诺书范文
2014/03/28 职场文书
西安大雁塔导游词
2015/02/10 职场文书
市场总监岗位职责
2015/02/11 职场文书
测量员岗位职责
2015/02/14 职场文书
因公司原因离职的辞职信范文
2015/05/12 职场文书
小学英语教师2015年度个人工作总结
2015/10/14 职场文书
python实现求纯色彩图像的边框
2021/04/08 Python
Pytorch 如何加速Dataloader提升数据读取速度
2021/05/28 Python
如何使用Tkinter进行窗口的管理与设置
2021/06/30 Python
Python+Tkinter制作专属图形化界面
2022/04/01 Python
Python通用验证码识别OCR库ddddocr的安装使用教程
2022/07/07 Python