Guardando un sacco di video Egghead.io, ho notato che uno schema comune è quello di restituire una promessa personalizzata e risolverla nei callback.
.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;
}
};
});
che normalmente scrivo questo come:
.factory('myFact', function($http) {
return {
getData: function() {
return $http.get('/path/to/api')
.then(function(res) {
return res.data;
});
}
};
});
C'è qualche vantaggio di restituire una promessa $q.defer()
piuttosto che un $http
promessa? Gli approcci sembrano identici a me.
Considererei questo [deferred antipattern] (https://github.com/petkaantonov/bluebird/wiki/Promise-anti-patterns#the-deferred-anti-pattern); tuttavia, elimina il tuo bisogno di conoscere l'oggetto '$ http' dal controller (cioè, non hai bisogno di conoscere i dati che vuoi effettivamente sia' response.data', non solo 'data') – Tom
il modo in cui fai normalmente è molto meglio e più pulito, non vedo alcun vantaggio nel percorrere la seconda via. '$ http' restituisce già una promessa, perché crearne una nuova? – Nobita
Stai aggiungendo una promessa risolta a una promessa risolta, è solo ridondante. $ q.defer() è più per cose che non hanno già una promessa. – ribsies