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