| "use strict"; |
| module.exports = function(Promise, PromiseArray) { |
| var util = require("./util.js"); |
| var async = require("./async.js"); |
| var tryCatch = util.tryCatch; |
| var errorObj = util.errorObj; |
| |
| Promise.prototype.progressed = function (handler) { |
| return this._then(undefined, undefined, handler, undefined, undefined); |
| }; |
| |
| Promise.prototype._progress = function (progressValue) { |
| if (this._isFollowingOrFulfilledOrRejected()) return; |
| this._target()._progressUnchecked(progressValue); |
| |
| }; |
| |
| Promise.prototype._progressHandlerAt = function (index) { |
| return index === 0 |
| ? this._progressHandler0 |
| : this[(index << 2) + index - 5 + 2]; |
| }; |
| |
| Promise.prototype._doProgressWith = function (progression) { |
| var progressValue = progression.value; |
| var handler = progression.handler; |
| var promise = progression.promise; |
| var receiver = progression.receiver; |
| |
| var ret = tryCatch(handler).call(receiver, progressValue); |
| if (ret === errorObj) { |
| if (ret.e != null && |
| ret.e.name !== "StopProgressPropagation") { |
| var trace = util.canAttachTrace(ret.e) |
| ? ret.e : new Error(util.toString(ret.e)); |
| promise._attachExtraTrace(trace); |
| promise._progress(ret.e); |
| } |
| } else if (ret instanceof Promise) { |
| ret._then(promise._progress, null, null, promise, undefined); |
| } else { |
| promise._progress(ret); |
| } |
| }; |
| |
| |
| Promise.prototype._progressUnchecked = function (progressValue) { |
| var len = this._length(); |
| var progress = this._progress; |
| for (var i = 0; i < len; i++) { |
| var handler = this._progressHandlerAt(i); |
| var promise = this._promiseAt(i); |
| if (!(promise instanceof Promise)) { |
| var receiver = this._receiverAt(i); |
| if (typeof handler === "function") { |
| handler.call(receiver, progressValue, promise); |
| } else if (receiver instanceof PromiseArray && |
| !receiver._isResolved()) { |
| receiver._promiseProgressed(progressValue, promise); |
| } |
| continue; |
| } |
| |
| if (typeof handler === "function") { |
| async.invoke(this._doProgressWith, this, { |
| handler: handler, |
| promise: promise, |
| receiver: this._receiverAt(i), |
| value: progressValue |
| }); |
| } else { |
| async.invoke(progress, promise, progressValue); |
| } |
| } |
| }; |
| }; |