| /* |
| Copyright (c) 2004-2006, The Dojo Foundation |
| All Rights Reserved. |
| |
| Licensed under the Academic Free License version 2.1 or above OR the |
| modified BSD license. For more information on Dojo licensing, see: |
| |
| http://dojotoolkit.org/community/licensing.shtml |
| */ |
| |
| dojo.require("dojo.Deferred"); |
| |
| dojo.provide("dojo.DeferredList"); |
| |
| |
| dojo.DeferredList = function (list, /*bool?*/ fireOnOneCallback, /*bool?*/ fireOnOneErrback, /*bool?*/ consumeErrors, /*Function?*/ canceller) { |
| 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; |
| |
| var index = 0; |
| |
| var _this = this; |
| |
| dojo.lang.forEach(this.list, function(d) { |
| var _index = index; |
| //dojo.debug("add cb/errb index "+_index); |
| d.addCallback(function(r) { _this._cbDeferred(_index, true, r) }); |
| d.addErrback(function(r) { _this._cbDeferred(_index, false, r) }); |
| index++; |
| }); |
| |
| }; |
| |
| |
| dojo.inherits(dojo.DeferredList, dojo.Deferred); |
| |
| dojo.lang.extend(dojo.DeferredList, { |
| |
| _cbDeferred: function (index, succeeded, result) { |
| //dojo.debug("Fire "+index+" succ "+succeeded+" res "+result); |
| 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) { |
| var d = new dojo.DeferredList(deferredList, false, true, false); |
| d.addCallback(function (results) { |
| var ret = []; |
| for (var i = 0; i < results.length; i++) { |
| ret.push(results[i][1]); |
| } |
| return ret; |
| }); |
| return d; |
| } |
| }); |
| |