Асинхронный JavaScript - обратные вызовы против отложенного / обещанного [дубликата]

Возможный дубликат:
Каковы различия между отложенным, обещанием и будущим в Javascript?

В последнее время я стараюсь улучшить качество моих JavaScript-приложений.

Один шаблон, который я принял, - это использование отдельного объекта «контекст данных» для загрузки данных для моего приложения (ранее я делал это непосредственно в моих моделях представления).

В следующем примере возвращаются данные, инициализированные на клиенте:

var mockData = (function($, undefined) {

    var fruit = [
        "apple",
        "orange",
        "banana",
        "pear"
        ];

    var getFruit = function() {
        return fruit;
    };

    return {
        getFruit: getFruit
    }
})(jQuery);

В большинстве случаев мы будем загружать данные с сервера, поэтому мы не можем вернуть немедленный ответ. Кажется, у меня есть два варианта того, как мы справляемся с этим в нашем API:

Использование обратного вызоваВозвращениеобещание.

Ранее я всегда использовал подход обратного вызова:

var getFruit = function(onFruitReady) {
    onFruitReady(fruit);
};

// ...

var FruitModel = function(dataContext, $) {
    return {
        render: function() {
            dataContext.getFruit(function(fruit) {
                // do something with fruit
            });
        }
    };
};

Тем не менее, я вижу, как можно оказаться в аду обратного вызова, особенно при создании сложных приложений JavaScript.

Затем я наткнулся на шаблон дизайна Promises. Вместо того чтобы требовать от вызывающей стороны предоставить обратный вызов, я вместо этого возвращаю «обещание», которое можно наблюдать:

var getFruit = function() {
    return $.Deferred().resolve(fruit).promise();
};

// ...
dataContext.getFruit().then(function(fruit) {
    // do something with fruit
});

Я вижу очевидные преимущества использования этого шаблона, тем более что я могуwait на нескольких отложенных объектах, которые могут быть очень полезны при загрузке данных инициализации для одностраничного приложения.

Тем не менее, я стремлюсь понять плюсы и минусы каждого шаблона, прежде чем начать использовать любой из них в гневе. Меня также интересует, в каком направлении движутся другие библиотеки. Похоже, в jQuery это так.

Вотссылка на скрипку я использую для тестирования.

Ответы на вопрос(2)

Ваш ответ на вопрос