Bei vielen Egghead.io-Videos habe ich festgestellt, dass ein gängiges Muster darin besteht, ein benutzerdefiniertes Versprechen zurückzugeben und es in den Rückrufen zu lösen.
.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;
}
};
});
Ich würde dies in der Regel schreiben wie:
.factory('myFact', function($http) {
return {
getData: function() {
return $http.get('/path/to/api')
.then(function(res) {
return res.data;
});
}
};
});
Gibt es einen Vorteil, ein $q.defer()
Versprechen eher als ein $http
Versprechen der Rückkehr? Die Ansätze sehen für mich identisch aus.
Ich würde dies die [latente Antipattern] (https://github.com/petkaantonov/bluebird/wiki/Promise-anti-pattern#the-deferred-anti-pattern); Sie brauchen jedoch nichts über das '$ http'-Objekt vom Controller zu wissen (dh, Sie müssen nicht wissen, dass die Daten, die Sie eigentlich wollen,' response.data' sind, nicht nur 'data') – Tom
Wie Sie normalerweise tun, ist viel besser und sauberer, ich sehe keinen Vorteil in der zweiten Route. '$ http' gibt bereits ein Versprechen zurück, warum ein neues erstellen? – Nobita
Sie fügen einem aufgelösten Versprechen ein aufgelöstes Versprechen hinzu, das nur überflüssig ist. $ q.defer() ist mehr für Dinge, die nicht schon ein Versprechen haben. – ribsies