可能重複:
What are the differences between Deferred, Promise and Future in Javascript?異步JavaScript - 回調VS遞延/無極
最近我一直在做,以提高我的JavaScript應用程序質量的努力。我已經採用的一種模式是使用單獨的「數據上下文」對象爲我的應用程序加載數據(以前我直接在我的視圖模型中執行此操作)。
下面的示例返回客戶端上初始化的數據:
var mockData = (function($, undefined) {
var fruit = [
"apple",
"orange",
"banana",
"pear"
];
var getFruit = function() {
return fruit;
};
return {
getFruit: getFruit
}
})(jQuery);
在大多數情況下,我們會從服務器加載數據,所以我們不能回到立即響應。看來我對我們如何處理這個我們的API在兩個選項:
- 使用回調
- 返回一個promise。
以前我一直用的回調方法:
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似乎就是這種情況。
這是我用來測試的小提琴的link。
那麼好消息:jQuery的AJAX API的*已經*回報承諾! – Pointy
[請閱讀此處的機制。](http://api.jquery.com/jQuery.ajax/#jqXHR) – Pointy
是的,這是我在第一個地方遇到的模式,因爲我正在尋找一種方法抽象我的ajax調用。 –