]>
Commit | Line | Data |
---|---|---|
1354d172 AD |
1 | define("dojo/DeferredList", ["./_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 | }); |