Асинхронный 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 это так.
Вотссылка на скрипку я использую для тестирования.