[Мы](http://netstream.ru) представляем начало нашего маленького [проекта](http://code.netstream.ru) по выкладыванию в open-source исходного кода наших проектов (полностью или частично). Первой ласточкой становится маленькая библиотека, предназначенная для работы с [Deferred](http://twistedmatrix.com/projects/core/documentation/howto/defer.html) из [Twisted Framework](http://twistedmatrix.com/) в [qooxdoo](http://qooxdoo.org/) на JavaScript. Практически полностью код был взят из [MochiKit.Async](http://mochikit.com/doc/html/MochiKit/Async.html) и адаптирован под qooxdoo. Полезные нововедения: если если в течение 1 секунды не будет обработана ошибка в Deferred (выполнение дойдет до конца цепочки callback, и останется ошибка), о ней будет сообщено на консоль, как о возможно необработанном исключении. Если Вы еще не знаете, что такое Deferred, я бы рекомендовал обратиться к [Twisted Handbook](http://twistedmatrix.com/projects/core/documentation/howto/index.html). Со своей стороны обещаю как можно скорее написать о Deferred по-русски. Итак, страничка [qx.Deferred](http://code.netstream.ru/wiki/QooxdooTwistedDeferred). Пример кода:


function callRPC(method, params)

{
    this.debug("API: call " + method + " with params: ");
    this.debug(params);
    var d = new netstream.lib.Deferred();

    var rpc = new qx.io.remote.Rpc();
    rpc.setTimeout(10000);
    rpc.setUrl(this.__api_url);
    rpc.callAsync(
        function (result, ex, id)
        {
            if (ex == null)
                d.callback(result);
            else
                d.errback(ex);
        },
        method, params);

    var that = this;
    d.addCallback(function (result) { that.debug("API: result:"); that.debug(result); return result; });
    d.addErrback(function (ex) { that.error(ex); return ex; });
    return d;
};



d = callRPC("somemethod", { 'someParams' });

d.addCallback(function (result) { alert("Got result: "+result); });