all.js 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. define([
  2. "../_base/array",
  3. "../Deferred",
  4. "../when"
  5. ], function(array, Deferred, when){
  6. "use strict";
  7. // module:
  8. // dojo/promise/all
  9. var some = array.some;
  10. return function all(objectOrArray){
  11. // summary:
  12. // Takes multiple promises and returns a new promise that is fulfilled
  13. // when all promises have been resolved or one has been rejected.
  14. // description:
  15. // Takes multiple promises and returns a new promise that is fulfilled
  16. // when all promises have been resolved or one has been rejected. If one of
  17. // the promises is rejected, the returned promise is also rejected. Canceling
  18. // the returned promise will *not* cancel any passed promises.
  19. // objectOrArray: Object|Array?
  20. // The promise will be fulfilled with a list of results if invoked with an
  21. // array, or an object of results when passed an object (using the same
  22. // keys). If passed neither an object or array it is resolved with an
  23. // undefined value.
  24. // returns: dojo/promise/Promise
  25. var object, array;
  26. if(objectOrArray instanceof Array){
  27. array = objectOrArray;
  28. }else if(objectOrArray && typeof objectOrArray === "object"){
  29. object = objectOrArray;
  30. }
  31. var results;
  32. var keyLookup = [];
  33. if(object){
  34. array = [];
  35. for(var key in object){
  36. if(Object.hasOwnProperty.call(object, key)){
  37. keyLookup.push(key);
  38. array.push(object[key]);
  39. }
  40. }
  41. results = {};
  42. }else if(array){
  43. results = [];
  44. }
  45. if(!array || !array.length){
  46. return new Deferred().resolve(results);
  47. }
  48. var deferred = new Deferred();
  49. deferred.promise.always(function(){
  50. results = keyLookup = null;
  51. });
  52. var waiting = array.length;
  53. some(array, function(valueOrPromise, index){
  54. if(!object){
  55. keyLookup.push(index);
  56. }
  57. when(valueOrPromise, function(value){
  58. if(!deferred.isFulfilled()){
  59. results[keyLookup[index]] = value;
  60. if(--waiting === 0){
  61. deferred.resolve(results);
  62. }
  63. }
  64. }, deferred.reject);
  65. return deferred.isFulfilled();
  66. });
  67. return deferred.promise; // dojo/promise/Promise
  68. };
  69. });