12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- define([
- "../_base/array",
- "../Deferred",
- "../when"
- ], function(array, Deferred, when){
- "use strict";
- // module:
- // dojo/promise/all
- var some = array.some;
- return function all(objectOrArray){
- // summary:
- // Takes multiple promises and returns a new promise that is fulfilled
- // when all promises have been resolved or one has been rejected.
- // description:
- // Takes multiple promises and returns a new promise that is fulfilled
- // when all promises have been resolved or one has been rejected. If one of
- // the promises is rejected, the returned promise is also rejected. Canceling
- // the returned promise will *not* cancel any passed promises.
- // objectOrArray: Object|Array?
- // The promise will be fulfilled with a list of results if invoked with an
- // array, or an object of results when passed an object (using the same
- // keys). If passed neither an object or array it is resolved with an
- // undefined value.
- // returns: dojo/promise/Promise
- var object, array;
- if(objectOrArray instanceof Array){
- array = objectOrArray;
- }else if(objectOrArray && typeof objectOrArray === "object"){
- object = objectOrArray;
- }
- var results;
- var keyLookup = [];
- if(object){
- array = [];
- for(var key in object){
- if(Object.hasOwnProperty.call(object, key)){
- keyLookup.push(key);
- array.push(object[key]);
- }
- }
- results = {};
- }else if(array){
- results = [];
- }
- if(!array || !array.length){
- return new Deferred().resolve(results);
- }
- var deferred = new Deferred();
- deferred.promise.always(function(){
- results = keyLookup = null;
- });
- var waiting = array.length;
- some(array, function(valueOrPromise, index){
- if(!object){
- keyLookup.push(index);
- }
- when(valueOrPromise, function(value){
- if(!deferred.isFulfilled()){
- results[keyLookup[index]] = value;
- if(--waiting === 0){
- deferred.resolve(results);
- }
- }
- }, deferred.reject);
- return deferred.isFulfilled();
- });
- return deferred.promise; // dojo/promise/Promise
- };
- });
|