一个简单的Node.js异步操作管理器分享
2014-04-29 00:00
531 查看
最近写nodejs比较多,刚开始的时候碰到的异步的操作比较少,因为想做的东西比较简单,一查api有同步的,为了省事就直接用同步的搞了,慢慢发现这不是个事呀,好好的异步特性不用,非得用同步的,真囧,并且很多东西木有同步的api的。
好!写异步的,慢慢的出现了这种代码。。。
恩,你也看到了,这样下去代码多丑,会像老太太的裹脚布一样了,于是就产生下面的异步操作管理器,小巧精致,嘿嘿,绝对够用,代码的事,用代码说话吧,直接亮代码,如码:
TODO:不够全面,比如说出错的就没有处理
好!写异步的,慢慢的出现了这种代码。。。
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 ); }
相关文章推荐
- 一个简单的Node.js异步操作管理器分享
- 樱花季到了,分享一个简单的樱花树H5制作。
- 分享自己做的一个简单的查询表达式模拟(ESQL,Linq)(3)
- 分享一个LiteDB做的简单考试系统辅助工具
- 使用JSP制作一个超简单的网页计算器的实例分享
- 分享一个简单的python模板引擎
- 【Android Developers Training】 34. 添加一个简单的分享行为(Action)
- 分享:实现了一个简单的嵌入式K/V数据库
- Android开发中一个简单实用的调试应用技巧分享
- 分享一个简单的页面刷新保持菜单不变的好东东
- 分享自己做的一个简单的查询表达式模拟(ESQL,Linq)(3)
- 时间有限,那就做一个简单的毕业心得分享吧
- 一个简单的手电筒APP源码分享(支持Android O(8.0)及以下版本)
- 分享一个PHP写的简单webservice服务端+客户端
- 使用JSP制作一个超简单的网页计算器的实例分享
- 分享一个.NET实现的简单高效WEB压力测试工具
- JQuery做的一个简单的点灯游戏分享
- 分享一个简单高效的C#随机函数生成器类
- 一个简单的购物车结算js分享