【发布时间】:2015-05-18 22:40:50
【问题描述】:
看了很多 Egghead.io 视频,我注意到一个常见的模式是返回一个自定义的 Promise 并在回调中解决它。
.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 承诺有什么好处吗?这些方法看起来和我一模一样。
【问题讨论】:
-
我认为这是deferred antipattern;但是,它确实消除了您从控制器中了解
$http对象的需要(即,您不需要知道您真正想要的数据是response.data,而不仅仅是data) -
你通常做的方式更好更干净,我认为选择第二条路线没有优势。
$http已经返回了一个承诺,为什么要创建一个新的? -
您正在将已解决的承诺添加到已解决的承诺中,这只是多余的。 $q.defer() 更适用于还没有承诺的事情。
标签: angularjs angular-promise angular-http