]> git.wh0rd.org - tt-rss.git/blob - lib/dojo/DeferredList.js
build custom layer of Dojo to speed up loading of tt-rss (refs #293)
[tt-rss.git] / lib / dojo / DeferredList.js
1 /*
2 Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
3 Available via Academic Free License >= 2.1 OR the modified BSD license.
4 see: http://dojotoolkit.org/license for details
5 */
6
7
8 if(!dojo._hasResource["dojo.DeferredList"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
9 dojo._hasResource["dojo.DeferredList"] = true;
10 dojo.provide("dojo.DeferredList");
11 dojo.DeferredList = function(/*Array*/ list, /*Boolean?*/ fireOnOneCallback, /*Boolean?*/ fireOnOneErrback, /*Boolean?*/ consumeErrors, /*Function?*/ canceller){
12 // summary:
13 // Provides event handling for a group of Deferred objects.
14 // description:
15 // DeferredList takes an array of existing deferreds and returns a new deferred of its own
16 // this new deferred will typically have its callback fired when all of the deferreds in
17 // the given list have fired their own deferreds. The parameters `fireOnOneCallback` and
18 // fireOnOneErrback, will fire before all the deferreds as appropriate
19 //
20 // list:
21 // The list of deferreds to be synchronizied with this DeferredList
22 // fireOnOneCallback:
23 // Will cause the DeferredLists callback to be fired as soon as any
24 // of the deferreds in its list have been fired instead of waiting until
25 // the entire list has finished
26 // fireonOneErrback:
27 // Will cause the errback to fire upon any of the deferreds errback
28 // canceller:
29 // A deferred canceller function, see dojo.Deferred
30 var resultList = [];
31 dojo.Deferred.call(this);
32 var self = this;
33 if(list.length === 0 && !fireOnOneCallback){
34 this.resolve([0, []]);
35 }
36 var finished = 0;
37 dojo.forEach(list, function(item, i){
38 item.then(function(result){
39 if(fireOnOneCallback){
40 self.resolve([i, result]);
41 }else{
42 addResult(true, result);
43 }
44 },function(error){
45 if(fireOnOneErrback){
46 self.reject(error);
47 }else{
48 addResult(false, error);
49 }
50 if(consumeErrors){
51 return null;
52 }
53 throw error;
54 });
55 function addResult(succeeded, result){
56 resultList[i] = [succeeded, result];
57 finished++;
58 if(finished === list.length){
59 self.resolve(resultList);
60 }
61
62 }
63 });
64 };
65 dojo.DeferredList.prototype = new dojo.Deferred();
66
67 dojo.DeferredList.prototype.gatherResults= function(deferredList){
68 // summary:
69 // Gathers the results of the deferreds for packaging
70 // as the parameters to the Deferred Lists' callback
71
72 var d = new dojo.DeferredList(deferredList, false, true, false);
73 d.addCallback(function(results){
74 var ret = [];
75 dojo.forEach(results, function(result){
76 ret.push(result[1]);
77 });
78 return ret;
79 });
80 return d;
81 };
82
83 }