|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
"use strict"; |
|
module.exports = function(Promise, isPromiseArrayProxy) { |
|
var ASSERT = require("./assert.js"); |
|
var util = require("./util.js"); |
|
var async = require("./async.js"); |
|
var errors = require("./errors.js"); |
|
var tryCatch1 = util.tryCatch1; |
|
var errorObj = util.errorObj; |
|
|
|
Promise.prototype.progressed = function Promise$progressed(handler) { |
|
return this._then(void 0, void 0, handler, |
|
void 0, void 0, this.progressed); |
|
}; |
|
|
|
Promise.prototype._progress = function Promise$_progress(progressValue) { |
|
if (this._isFollowingOrFulfilledOrRejected()) return; |
|
this._progressUnchecked(progressValue); |
|
|
|
}; |
|
|
|
Promise.prototype._progressHandlerAt = |
|
function Promise$_progressHandlerAt(index) { |
|
if (index === 0) return this._progressHandler0; |
|
return this[index + 2 - 5]; |
|
}; |
|
|
|
Promise.prototype._doProgressWith = |
|
function Promise$_doProgressWith(progression) { |
|
var progressValue = progression.value; |
|
var handler = progression.handler; |
|
var promise = progression.promise; |
|
var receiver = progression.receiver; |
|
|
|
this._pushContext(); |
|
var ret = tryCatch1(handler, receiver, progressValue); |
|
this._popContext(); |
|
|
|
if (ret === errorObj) { |
|
if (ret.e != null && |
|
ret.e.name !== "StopProgressPropagation") { |
|
var trace = errors.canAttach(ret.e) |
|
? ret.e : new Error(ret.e + ""); |
|
promise._attachExtraTrace(trace); |
|
promise._progress(ret.e); |
|
} |
|
} |
|
else if (Promise.is(ret)) { |
|
ret._then(promise._progress, null, null, promise, void 0, |
|
this._progress); |
|
} |
|
else { |
|
promise._progress(ret); |
|
} |
|
}; |
|
|
|
|
|
Promise.prototype._progressUnchecked = |
|
function Promise$_progressUnchecked(progressValue) { |
|
if (!this.isPending()) return; |
|
var len = this._length(); |
|
|
|
for (var i = 0; i < len; i += 5) { |
|
var handler = this._progressHandlerAt(i); |
|
var promise = this._promiseAt(i); |
|
if (!Promise.is(promise)) { |
|
var receiver = this._receiverAt(i); |
|
if (typeof handler === "function") { |
|
handler.call(receiver, progressValue, promise); |
|
} |
|
else if (Promise.is(receiver) && receiver._isProxied()) { |
|
receiver._progressUnchecked(progressValue); |
|
} |
|
else if (isPromiseArrayProxy(receiver, promise)) { |
|
receiver._promiseProgressed(progressValue, promise); |
|
} |
|
continue; |
|
} |
|
|
|
if (typeof handler === "function") { |
|
this._doProgressWith(({handler: handler, |
|
promise: promise, |
|
receiver: this._receiverAt(i), |
|
value: progressValue})); |
|
} |
|
else { |
|
promise._progress(progressValue); |
|
} |
|
} |
|
}; |
|
}; |
|
|