summaryrefslogtreecommitdiff
path: root/includes/js/dojo/DeferredList.js
diff options
context:
space:
mode:
Diffstat (limited to 'includes/js/dojo/DeferredList.js')
-rw-r--r--includes/js/dojo/DeferredList.js88
1 files changed, 88 insertions, 0 deletions
diff --git a/includes/js/dojo/DeferredList.js b/includes/js/dojo/DeferredList.js
new file mode 100644
index 0000000..0a77d11
--- /dev/null
+++ b/includes/js/dojo/DeferredList.js
@@ -0,0 +1,88 @@
+if(!dojo._hasResource["dojo.DeferredList"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojo.DeferredList"] = true;
+dojo.provide("dojo.DeferredList");
+dojo.declare("dojo.DeferredList", dojo.Deferred, {
+ constructor: function(/*Array*/ list, /*Boolean?*/ fireOnOneCallback, /*Boolean?*/ fireOnOneErrback, /*Boolean?*/ consumeErrors, /*Function?*/ canceller){
+ // summary:
+ // Provides event handling for a group of Deferred objects.
+ // description:
+ // DeferredList takes an array of existing deferreds and returns a new deferred of its own
+ // this new deferred will typically have its callback fired when all of the deferreds in
+ // the given list have fired their own deferreds. The parameters `fireOnOneCallback` and
+ // fireOnOneErrback, will fire before all the deferreds as appropriate
+ //
+ // list:
+ // The list of deferreds to be synchronizied with this DeferredList
+ // fireOnOneCallback:
+ // Will cause the DeferredLists callback to be fired as soon as any
+ // of the deferreds in its list have been fired instead of waiting until
+ // the entire list has finished
+ // fireonOneErrback:
+ // Will cause the errback to fire upon any of the deferreds errback
+ // canceller:
+ // A deferred canceller function, see dojo.Deferred
+ this.list = list;
+ this.resultList = new Array(this.list.length);
+
+ // Deferred init
+ this.chain = [];
+ this.id = this._nextId();
+ this.fired = -1;
+ this.paused = 0;
+ this.results = [null, null];
+ this.canceller = canceller;
+ this.silentlyCancelled = false;
+
+ if(this.list.length === 0 && !fireOnOneCallback){
+ this.callback(this.resultList);
+ }
+
+ this.finishedCount = 0;
+ this.fireOnOneCallback = fireOnOneCallback;
+ this.fireOnOneErrback = fireOnOneErrback;
+ this.consumeErrors = consumeErrors;
+
+ dojo.forEach(this.list, function(d, index){
+ d.addCallback(this, function(r){ this._cbDeferred(index, true, r); return r; });
+ d.addErrback(this, function(r){ this._cbDeferred(index, false, r); return r; });
+ }, this);
+ },
+
+ _cbDeferred: function(index, succeeded, result){
+ // summary:
+ // The DeferredLists' callback handler
+
+ this.resultList[index] = [succeeded, result]; this.finishedCount += 1;
+ if(this.fired !== 0){
+ if(succeeded && this.fireOnOneCallback){
+ this.callback([index, result]);
+ }else if(!succeeded && this.fireOnOneErrback){
+ this.errback(result);
+ }else if(this.finishedCount == this.list.length){
+ this.callback(this.resultList);
+ }
+ }
+ if(!succeeded && this.consumeErrors){
+ result = null;
+ }
+ return result;
+ },
+
+ gatherResults: function(deferredList){
+ // summary:
+ // Gathers the results of the deferreds for packaging
+ // as the parameters to the Deferred Lists' callback
+
+ var d = new dojo.DeferredList(deferredList, false, true, false);
+ d.addCallback(function(results){
+ var ret = [];
+ dojo.forEach(results, function(result){
+ ret.push(result[1]);
+ });
+ return ret;
+ });
+ return d;
+ }
+});
+
+}