观看了很多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
承诺是否有任何好处?这些方法与我相同。
答案 0 :(得分:3)
不,没有优势,它是相同的,在您剪切的第一个代码中,您创建了一个$q.defer()实例,然后您调用了其resolve()
方法来创建已解决的承诺强>
使用异步函数和将来的对象时,您将需要了解并传递 angularJs 的过程您将需要知道的某些未来时刻的值或新数据,因为您的应用中的相关方可能需要在完成时访问延迟任务的结果。
现在使用$http时,您不必执行任何操作,因为它已经返回已解决的承诺,您可以直接调用它then() { {3}}方法,除非你有不同的方法来做事,你需要实现不同的方法。
但并非所有angularJs服务都会为您完成工作,例如,请查看$resource
,其中包含$http
以用于RESTful Web API方案。 $resource
不会返回已解决的承诺,承诺是的,您将获得一个,但您需要做最后一步解决( check this stack question或this,也许this article about Amber Kaplan's own experience working with Rest)。
所以你如何做到这一点很好,这也就是我在使用$http
时也是这样做的,但第一个代码片段是我们将要搜索的代码。将需要以$http
执行不同的操作,或强制其他服务使用' 使用'或者' 像' AJAX。