Возможный дубликат:
В чем разница между отложенным, обещанием и будущим в 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.
Вот ссылка на скрипт, который я использую для тестирования.
.done()
и т. д. - person Pointy   schedule 02.01.2013