50 lines
1.4 KiB
JavaScript
50 lines
1.4 KiB
JavaScript
|
define("dojo/promise/first", [
|
||
|
"../_base/array",
|
||
|
"../Deferred",
|
||
|
"../when"
|
||
|
], function(array, Deferred, when){
|
||
|
"use strict";
|
||
|
|
||
|
// module:
|
||
|
// dojo/promise/first
|
||
|
|
||
|
var forEach = array.forEach;
|
||
|
|
||
|
return function first(objectOrArray){
|
||
|
// summary:
|
||
|
// Takes multiple promises and returns a new promise that is fulfilled
|
||
|
// when the first of these promises is fulfilled.
|
||
|
// description:
|
||
|
// Takes multiple promises and returns a new promise that is fulfilled
|
||
|
// when the first of these promises is fulfilled. Canceling the returned
|
||
|
// promise will *not* cancel any passed promises. The promise will be
|
||
|
// fulfilled with the value of the first fulfilled promise.
|
||
|
// objectOrArray: Object|Array?
|
||
|
// The promises are taken from the array or object values. If no value
|
||
|
// is passed, the returned promise is resolved with an undefined value.
|
||
|
// returns: dojo/promise/Promise
|
||
|
|
||
|
var array;
|
||
|
if(objectOrArray instanceof Array){
|
||
|
array = objectOrArray;
|
||
|
}else if(objectOrArray && typeof objectOrArray === "object"){
|
||
|
array = [];
|
||
|
for(var key in objectOrArray){
|
||
|
if(Object.hasOwnProperty.call(objectOrArray, key)){
|
||
|
array.push(objectOrArray[key]);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if(!array || !array.length){
|
||
|
return new Deferred().resolve();
|
||
|
}
|
||
|
|
||
|
var deferred = new Deferred();
|
||
|
forEach(array, function(valueOrPromise){
|
||
|
when(valueOrPromise, deferred.resolve, deferred.reject);
|
||
|
});
|
||
|
return deferred.promise; // dojo/promise/Promise
|
||
|
};
|
||
|
});
|