接上篇,要在JavaScript异步环境中支持串行化执行,尝试参考了 CommonJS的Promise标准 后,决定使用没有状态的Promise 方式来实现。
严格说来,Promise标准应该包括:
- 暴露给调用的then接口,用以串联:这个接口永远返回promise对象本身
- 内部维护每一次执行的状态,接受fulfilledHandler/ errorHandler/ progressHandler 以处理 成功/失败/执行中 状态
- then接口里的待执行函数,需要回调promise以触发下一次执行(执行链思路大同小异,上篇的问题只是不串行
- 内部维护一个队列,在构造执行链时将待执行函数存入
我的版本没这么复杂,在不考虑状态维护的情况下,简单的以”next” 消息尾触发执行链:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
var util = require('util') var Promise = function () { events.EventEmitter.call(this); this.queue = []; function nextHandler() { if (this.queue) { var handler = this.queue.shift(); handler(); this.once('next', nextHandler); } } this.once('next', nextHandler); }; util.inherits(Promise, events.EventEmitter); Promise.prototype.then = function (func) { if (typeof func === 'function') { this.queue.push(func); } return this; }; Promise.prototype.next = function (data) { console.log(data); this.emit('next', data); }; var promise = new Promise(); promise.then( function () { savePerson('Mo Ye', 'Male', function (err) { if (err) console.log(err); promise.next('savePerson accomplished.'); }); } ). then(function () { findPersonsAndDelete('Mo Ye', function (err) { if (err) console.log(err); promise.next('findPersonsAndDelete accomplished.'); }); }).then(function () { disconnectMongo(function (err) { if (err) console.log(err); promise.next('disconnectMongo accomplished.'); }); }).next('start...'); |
执行效果:
构造执行链的代码仍称不上雅观,替自己捉急,决定花点时间,好好学学 Q 的源码 🙂
打赏作者
您的支持将激励我继续创作!