DeferredList.js 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. define(["./_base/kernel", "./_base/Deferred", "./_base/array"], function(dojo, Deferred, darray){
  2. // module:
  3. // dojo/DeferredList
  4. dojo.DeferredList = function(/*Array*/ list, /*Boolean?*/ fireOnOneCallback, /*Boolean?*/ fireOnOneErrback, /*Boolean?*/ consumeErrors, /*Function?*/ canceller){
  5. // summary:
  6. // Deprecated, use dojo/promise/all instead.
  7. // Provides event handling for a group of Deferred objects.
  8. // description:
  9. // DeferredList takes an array of existing deferreds and returns a new deferred of its own
  10. // this new deferred will typically have its callback fired when all of the deferreds in
  11. // the given list have fired their own deferreds. The parameters `fireOnOneCallback` and
  12. // fireOnOneErrback, will fire before all the deferreds as appropriate
  13. // list:
  14. // The list of deferreds to be synchronizied with this DeferredList
  15. // fireOnOneCallback:
  16. // Will cause the DeferredLists callback to be fired as soon as any
  17. // of the deferreds in its list have been fired instead of waiting until
  18. // the entire list has finished
  19. // fireonOneErrback:
  20. // Will cause the errback to fire upon any of the deferreds errback
  21. // canceller:
  22. // A deferred canceller function, see dojo.Deferred
  23. var resultList = [];
  24. Deferred.call(this);
  25. var self = this;
  26. if(list.length === 0 && !fireOnOneCallback){
  27. this.resolve([0, []]);
  28. }
  29. var finished = 0;
  30. darray.forEach(list, function(item, i){
  31. item.then(function(result){
  32. if(fireOnOneCallback){
  33. self.resolve([i, result]);
  34. }else{
  35. addResult(true, result);
  36. }
  37. },function(error){
  38. if(fireOnOneErrback){
  39. self.reject(error);
  40. }else{
  41. addResult(false, error);
  42. }
  43. if(consumeErrors){
  44. return null;
  45. }
  46. throw error;
  47. });
  48. function addResult(succeeded, result){
  49. resultList[i] = [succeeded, result];
  50. finished++;
  51. if(finished === list.length){
  52. self.resolve(resultList);
  53. }
  54. }
  55. });
  56. };
  57. dojo.DeferredList.prototype = new Deferred();
  58. dojo.DeferredList.prototype.gatherResults = function(deferredList){
  59. // summary:
  60. // Gathers the results of the deferreds for packaging
  61. // as the parameters to the Deferred Lists' callback
  62. // deferredList: dojo/DeferredList
  63. // The deferred list from which this function gathers results.
  64. // returns: dojo/DeferredList
  65. // The newly created deferred list which packs results as
  66. // parameters to its callback.
  67. var d = new dojo.DeferredList(deferredList, false, true, false);
  68. d.addCallback(function(results){
  69. var ret = [];
  70. darray.forEach(results, function(result){
  71. ret.push(result[1]);
  72. });
  73. return ret;
  74. });
  75. return d;
  76. };
  77. return dojo.DeferredList;
  78. });