diff options
author | Richard Beales <[email protected]> | 2013-03-18 07:32:01 +0000 |
---|---|---|
committer | Richard Beales <[email protected]> | 2013-03-18 07:32:01 +0000 |
commit | 7c97d17aaf373339a8bcd917ad59ca6018148f0d (patch) | |
tree | 5a3c04f0f9529be392c1263d3feb75806eb43797 /lib/dojo/promise/all.js.uncompressed.js | |
parent | 70db7424e7068701e60cc5bcdfe8f858be508179 (diff) | |
parent | c670a80ddd9b03bd4ea6d940a9ed682fd26248d7 (diff) |
Merge remote-tracking branch 'upstream/master'
Diffstat (limited to 'lib/dojo/promise/all.js.uncompressed.js')
-rw-r--r-- | lib/dojo/promise/all.js.uncompressed.js | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/lib/dojo/promise/all.js.uncompressed.js b/lib/dojo/promise/all.js.uncompressed.js new file mode 100644 index 000000000..278f604a6 --- /dev/null +++ b/lib/dojo/promise/all.js.uncompressed.js @@ -0,0 +1,76 @@ +define("dojo/promise/all", [ + "../_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 fulfilled. + // description: + // Takes multiple promises and returns a new promise that is fulfilled + // when all promises have been fulfilled. 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 + }; +}); |