Возможный дубликат:
В чем отличия между отложенными, обещаниями и будущими в Javascript?
В последнее время я прилагаю усилия для улучшения качества моих приложений 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.
Здесь ссылка к скрипту, которую я использую для тестирования.