DeferredList.js 2.6 KB

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