Rev 1372 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
/*Copyright (c) 2004-2006, The Dojo FoundationAll Rights Reserved.Licensed under the Academic Free License version 2.1 or above OR themodified BSD license. For more information on Dojo licensing, see:http://dojotoolkit.org/community/licensing.shtml*/dojo.provide("dojo.Deferred");dojo.require("dojo.lang.func");dojo.Deferred = function (canceller) {this.chain = [];this.id = this._nextId();this.fired = -1;this.paused = 0;this.results = [null, null];this.canceller = canceller;this.silentlyCancelled = false;};dojo.lang.extend(dojo.Deferred, {getFunctionFromArgs:function () {var a = arguments;if ((a[0]) && (!a[1])) {if (dojo.lang.isFunction(a[0])) {return a[0];} else {if (dojo.lang.isString(a[0])) {return dj_global[a[0]];}}} else {if ((a[0]) && (a[1])) {return dojo.lang.hitch(a[0], a[1]);}}return null;}, makeCalled:function () {var deferred = new dojo.Deferred();deferred.callback();return deferred;}, repr:function () {var state;if (this.fired == -1) {state = "unfired";} else {if (this.fired == 0) {state = "success";} else {state = "error";}}return "Deferred(" + this.id + ", " + state + ")";}, toString:dojo.lang.forward("repr"), _nextId:(function () {var n = 1;return function () {return n++;};})(), cancel:function () {if (this.fired == -1) {if (this.canceller) {this.canceller(this);} else {this.silentlyCancelled = true;}if (this.fired == -1) {this.errback(new Error(this.repr()));}} else {if ((this.fired == 0) && (this.results[0] instanceof dojo.Deferred)) {this.results[0].cancel();}}}, _pause:function () {this.paused++;}, _unpause:function () {this.paused--;if ((this.paused == 0) && (this.fired >= 0)) {this._fire();}}, _continue:function (res) {this._resback(res);this._unpause();}, _resback:function (res) {this.fired = ((res instanceof Error) ? 1 : 0);this.results[this.fired] = res;this._fire();}, _check:function () {if (this.fired != -1) {if (!this.silentlyCancelled) {dojo.raise("already called!");}this.silentlyCancelled = false;return;}}, callback:function (res) {this._check();this._resback(res);}, errback:function (res) {this._check();if (!(res instanceof Error)) {res = new Error(res);}this._resback(res);}, addBoth:function (cb, cbfn) {var enclosed = this.getFunctionFromArgs(cb, cbfn);if (arguments.length > 2) {enclosed = dojo.lang.curryArguments(null, enclosed, arguments, 2);}return this.addCallbacks(enclosed, enclosed);}, addCallback:function (cb, cbfn) {var enclosed = this.getFunctionFromArgs(cb, cbfn);if (arguments.length > 2) {enclosed = dojo.lang.curryArguments(null, enclosed, arguments, 2);}return this.addCallbacks(enclosed, null);}, addErrback:function (cb, cbfn) {var enclosed = this.getFunctionFromArgs(cb, cbfn);if (arguments.length > 2) {enclosed = dojo.lang.curryArguments(null, enclosed, arguments, 2);}return this.addCallbacks(null, enclosed);return this.addCallbacks(null, cbfn);}, addCallbacks:function (cb, eb) {this.chain.push([cb, eb]);if (this.fired >= 0) {this._fire();}return this;}, _fire:function () {var chain = this.chain;var fired = this.fired;var res = this.results[fired];var self = this;var cb = null;while (chain.length > 0 && this.paused == 0) {var pair = chain.shift();var f = pair[fired];if (f == null) {continue;}try {res = f(res);fired = ((res instanceof Error) ? 1 : 0);if (res instanceof dojo.Deferred) {cb = function (res) {self._continue(res);};this._pause();}}catch (err) {fired = 1;res = err;}}this.fired = fired;this.results[fired] = res;if ((cb) && (this.paused)) {res.addBoth(cb);}}});