Subversion Repositories Applications.papyrus

Rev

Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

/*
        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.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);
        }
}});