Asynchrones JavaScript - Rückrufe vs. Zurückgestellt / Versprechen [duplizieren]

Mögliche Duplikate:
Was sind die Unterschiede zwischen Deferred, Promise und Future in Javascript?

In letzter Zeit habe ich mich bemüht, die Qualität meiner JavaScript-Anwendungen zu verbessern.

Ein Muster, das ich übernommen habe, ist die Verwendung eines separaten "Datenkontext" -Objekts zum Laden von Daten für meine Anwendung (zuvor habe ich dies direkt in meinen Ansichtsmodellen getan).

Das folgende Beispiel gibt Daten zurück, die auf dem Client initialisiert wurden:

var mockData = (function($, undefined) {

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

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

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

In den meisten Fällen werden Daten vom Server geladen, sodass keine sofortige Antwort möglich ist. Es scheint, dass ich in unserer API zwei Möglichkeiten habe, wie wir damit umgehen:

Rückruf verwendenRückgabe aversprechen.

Bisher habe ich immer den Callback-Ansatz verwendet:

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

// ...

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

Ich kann jedoch sehen, wie es möglich ist, in der Rückruf-Hölle zu landen, insbesondere beim Erstellen komplexer JavaScript-Anwendungen.

Dann bin ich auf das Entwurfsmuster Promises gestoßen. Anstatt vom Anrufer einen Rückruf zu verlangen, gebe ich stattdessen ein "Versprechen" zurück, das eingehalten werden kann:

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

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

Ich kann offensichtliche Vorteile der Verwendung dieses Musters erkennen, zumal ich es kannwait für mehrere zurückgestellte Objekte, die beim Laden von Initialisierungsdaten für eine einzelne Seitenanwendung sehr nützlich sein können.

Ich bin jedoch sehr daran interessiert, die Vor- und Nachteile der einzelnen Muster zu verstehen, bevor ich anfange, sie im Zorn zu verwenden. Ich bin auch daran interessiert, ob dies die Richtung ist, in die andere Bibliotheken gehen. Dies scheint bei jQuery der Fall zu sein.

Hier ist einVerknüpfung zu der Geige, die ich zum Testen benutze.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage