Наблюдая за множеством видеороликов Egghead.io, я заметил, что общий шаблон - это возврат пользовательского обещания и его устранение в обратных вызовах.
.factory('myFact', function($q, $http) {
return {
getData: function() {
var deferred = $q.defer();
$http.get('/path/to/api')
.success(function(data) {
deferred.resolve(data);
});
return deferred.promise;
}
};
});
Я обычно пишу это как:
.factory('myFact', function($http) {
return {
getData: function() {
return $http.get('/path/to/api')
.then(function(res) {
return res.data;
});
}
};
});
Есть ли какое-либо преимущество возвращения $q.defer()
обещания, а не $http
обещания? Подходы похожи на меня.
Я бы счел это [отсроченным антипаттером] (https://github.com/petkaantonov/bluebird/wiki/Promise-anti-patterns#the-deferred-anti-pattern); тем не менее, это избавляет вас от необходимости знать о '$ http' объекте от контроллера (т. е. вам не нужно знать данные, которые вы действительно хотите, это' response.data', а не только 'data') – Tom
то, что вы обычно делаете, намного лучше и чище, я не вижу преимущества в том, чтобы идти на второй маршрут. '$ http' уже возвращает обещание, зачем создавать новый? – Nobita
Вы добавляете разрешенное обещание к разрешенному обещанию, оно просто избыточно. $ q.defer() больше подходит для вещей, которые уже не имеют обещания. – ribsies