You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							148 lines
						
					
					
						
							3.9 KiB
						
					
					
				
			
		
		
	
	
							148 lines
						
					
					
						
							3.9 KiB
						
					
					
				"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; | 
						|
};
 | 
						|
 |