| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148 | "use strict";module.exports =function(Promise, PromiseArray, apiRejection) {var util = require("./util");var RangeError = require("./errors").RangeError;var AggregateError = require("./errors").AggregateError;var isArray = util.isArray;var CANCELLATION = {};function SomePromiseArray(values) {    this.constructor$(values);    this._howMany = 0;    this._unwrap = false;    this._initialized = false;}util.inherits(SomePromiseArray, PromiseArray);SomePromiseArray.prototype._init = function () {    if (!this._initialized) {        return;    }    if (this._howMany === 0) {        this._resolve([]);        return;    }    this._init$(undefined, -5);    var isArrayResolved = isArray(this._values);    if (!this._isResolved() &&        isArrayResolved &&        this._howMany > this._canPossiblyFulfill()) {        this._reject(this._getRangeError(this.length()));    }};SomePromiseArray.prototype.init = function () {    this._initialized = true;    this._init();};SomePromiseArray.prototype.setUnwrap = function () {    this._unwrap = true;};SomePromiseArray.prototype.howMany = function () {    return this._howMany;};SomePromiseArray.prototype.setHowMany = function (count) {    this._howMany = count;};SomePromiseArray.prototype._promiseFulfilled = function (value) {    this._addFulfilled(value);    if (this._fulfilled() === this.howMany()) {        this._values.length = this.howMany();        if (this.howMany() === 1 && this._unwrap) {            this._resolve(this._values[0]);        } else {            this._resolve(this._values);        }        return true;    }    return false;};SomePromiseArray.prototype._promiseRejected = function (reason) {    this._addRejected(reason);    return this._checkOutcome();};SomePromiseArray.prototype._promiseCancelled = function () {    if (this._values instanceof Promise || this._values == null) {        return this._cancel();    }    this._addRejected(CANCELLATION);    return this._checkOutcome();};SomePromiseArray.prototype._checkOutcome = function() {    if (this.howMany() > this._canPossiblyFulfill()) {        var e = new AggregateError();        for (var i = this.length(); i < this._values.length; ++i) {            if (this._values[i] !== CANCELLATION) {                e.push(this._values[i]);            }        }        if (e.length > 0) {            this._reject(e);        } else {            this._cancel();        }        return true;    }    return false;};SomePromiseArray.prototype._fulfilled = function () {    return this._totalResolved;};SomePromiseArray.prototype._rejected = function () {    return this._values.length - this.length();};SomePromiseArray.prototype._addRejected = function (reason) {    this._values.push(reason);};SomePromiseArray.prototype._addFulfilled = function (value) {    this._values[this._totalResolved++] = value;};SomePromiseArray.prototype._canPossiblyFulfill = function () {    return this.length() - this._rejected();};SomePromiseArray.prototype._getRangeError = function (count) {    var message = "Input array must contain at least " +            this._howMany + " items but contains only " + count + " items";    return new RangeError(message);};SomePromiseArray.prototype._resolveEmptyArray = function () {    this._reject(this._getRangeError(0));};function some(promises, howMany) {    if ((howMany | 0) !== howMany || howMany < 0) {        return apiRejection("expecting a positive integer\u000a\u000a    See http://goo.gl/MqrFmX\u000a");    }    var ret = new SomePromiseArray(promises);    var promise = ret.promise();    ret.setHowMany(howMany);    ret.init();    return promise;}Promise.some = function (promises, howMany) {    return some(promises, howMany);};Promise.prototype.some = function (howMany) {    return some(this, howMany);};Promise._SomePromiseArray = SomePromiseArray;};
 |