今天从GIT源码库中下载了promise.js,发现该源码是基于Web前端JavaScript写的,并不能直接用于nodejs。还好代码不是很多,也不是很复杂。经过分析整合,将其实现为nodejs的一个框架,代码如下:
(function(){ /** * Copyright 2012-2013 (c) Pierre Duquesne <stackp@online.fr> * script: promise.js * description: promises的nodejs模块 * modified: https://github.com/stackp/promisejs * authors: alwu007@sina.cn * */ var Promise = exports.Promise = function(){ this._callbacks = []; }; Promise.prototype.then = function(func, context){ //处理回调结果的方法 function doCallbackResults(r) { if (r instanceof Promise) { r.then(function(err, values){ p.done(err, values); }); } else { p.done(null, r); } } var p = new Promise(); if (this._isdone) { var results = func.apply(context, this.results); doCallbackResults(results); } else { this._callbacks.push(function(){ var results = func.apply(context, arguments); doCallbackResults(results); }); } return p; }; Promise.prototype.done = function(){ this.results = arguments; this._isdone = true; for (var i=0; i<this._callbacks.length; i++) { this._callbacks[i].apply(null, arguments); } this._callbacks = []; }; Promise.join = function(promises){ var p = new Promise(); var results = []; if (!promises || !promises.length) { p.done(results); return p; } var numdone = 0; var total = promises.length; function notifier(i) { return function() { numdone += 1; results[i] = Array.prototype.slice.call(arguments); if (numdone === total) { p.done(results); } }; } for (var i = 0; i < total; i++) { promises[i].then(notifier(i)); } return p; }; Promise.chain = function(funcs, args) { var p = new Promise(); if (!funcs || !funcs.length) { p.done.apply(p, args); } else { funcs[0].apply(null, args).then(function(){ funcs.splice(0, 1); Promise.chain(funcs, arguments).then(function(){ p.done.apply(p, arguments); }); }); } return p; }; })();
另附测试代码如下:
/** * script: test.js * description: promise.js测试代码 * */ var promise = require('./mypromise'); function asyncfoo() { var p = new promise.Promise(); setTimeout(function(){ p.done(); }, 1000); return p; } function syncfoo() { var p = new promise.Promise(); p.done(); return p; } var o = {}; /* asyncfoo().then(function(){ return 'Raymond'; }, o).then(function(err, name){ o.name = name; return asyncfoo().then(asyncfoo).then(function(){ return asyncfoo().then(asyncfoo).then(function(){ return 18; }); }); }, o).then(function(err, age){ o.age = age; return asyncfoo().then(asyncfoo).then(function(){ return asyncfoo().then(asyncfoo).then(function(){ return 'boy'; }); }).then(function(err, sex){ return sex; }); }).then(function(err, sex){ o.sex = sex; return 'Hello, world!'; }).then(function(err, say){ o.say = say; console.dir(o); }); syncfoo().then(function(){ return 'Raymond'; }, o).then(function(err, name){ o.name = name; return syncfoo().then(syncfoo).then(function(){ return syncfoo().then(syncfoo).then(function(){ return 18; }); }); }, o).then(function(err, age){ o.age = age; return asyncfoo().then(asyncfoo).then(function(){ return asyncfoo().then(asyncfoo).then(function(){ return 'boy'; }); }).then(function(err, sex){ return sex; }); }).then(function(err, sex){ o.sex = sex; return 'Hello, world!'; }).then(function(err, say){ o.say = say; console.dir(o); }); */ function asyncfoo1(){ var p = new promise.Promise(); setTimeout(function(){ p.done(null, 'Raymond'); }, 1000); return p; } function asyncfoo2(err, name){ o.name = name; var p = new promise.Promise(); setTimeout(function(){ p.done(null, 18); }, 1000); return p; } function asyncfoo3(err, age){ o.age = age; var p = new promise.Promise(); setTimeout(function(){ p.done(null, 'boy'); }, 1000); return p; } function asyncfoo4(){ var p = new promise.Promise(); setTimeout(function(){ p.done(null, 'Hello, world!'); }, 1000); return p; } promise.Promise.chain([asyncfoo1, asyncfoo2, asyncfoo3]).then(function(err, sex){ o.sex = sex; return asyncfoo4(); }).then(function(err, say){ o.say = say; }).then(function(){ console.dir(o); });
标签:
nodejs,promises
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件!
如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
暂无“基于promise.js实现nodejs的promises库”评论...
更新动态
2024年11月13日
2024年11月13日
- 宝可梦大集结开服5选1礼包怎么选 新手5选1宝可梦推荐
- 劳斯莱斯女车主丈夫坦言拒赔原因:确实有流量因素
- 《心灵杀手2》PS5 Pro实机演示:质量模式4K 30帧
- 玩家分享买二手盘暖心经历:盘上还有小贴纸表达感谢
- 殷秀梅.2014-沁园春·雪【太平洋影音】【WAV+CUE】
- 范玮琪.2003-真善美【福茂】【WAV+CUE】
- 陈雷.1995-烧翻卖【金圆唱片】【WAV+CUE】
- 乱石堆中一粒砂金——《使命召唤21》评测
- 【果娘聊天室】双11即将结束,各位今年买了啥?
- 双十一必入爆款:微星MPGZ890 EDGE TI刀锋钛主板评测
- 侃侃《植觉DSD》[低速原抓WAV+CUE]
- 摇滚乐.FlorenceandTheMachine-HowBig,HowBlue,HowBeautiful(2015)[96-24]FLAC
- 黑鸭子2008《听·好女人心》2CD[限量版][WAV+CUE]
- 孟庭苇《月亮说话》24K Gold 日本壓碟[WAV+CUE][1G]
- 齐秦《齐秦精选》环球 K2HD版 [低速原抓WAV+CUE][1G]