Angularjs 角度:返回$q.defer().promise而不是$http promise
通过观看大量Egghead.io视频,我注意到一种常见的模式是返回自定义承诺并在回调中解决它Angularjs 角度:返回$q.defer().promise而不是$http promise,angularjs,angular-promise,angular-http,Angularjs,Angular Promise,Angular Http,通过观看大量Egghead.io视频,我注意到一种常见的模式是返回自定义承诺并在回调中解决它 .factory('myFact', function($q, $http) { return { getData: function() { var deferred = $q.defer(); $http.get('/path/to/api') .success(function(data) {
.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
承诺有什么好处?这些方法对我来说都是一样的。不,没有优势,都是一样的,在你的第一个代码片段中,你创建了一个实例,然后你调用了它的resolve()
方法来创建一个已解决的承诺
这就是在异步处理函数和将来的对象时,您需要知道并传递throw-inangularJs的过程,这些对象在将来的某个时刻将具有不同的值或新数据,您需要知道何时发生,因为应用程序中的相关方可能需要访问结果任务完成时延迟的任务
现在,在使用时,您不必执行任何操作,因为它已经返回了一个已解决的承诺,您可以直接调用它的方法,除非您有不同的方法来做事情,并且需要实现不同的方法
但并不是所有的angularJs服务都能为您完成这项工作,比如看一下$resource
,它包装了$http
,用于RESTfulWebAPI场景$resource
不会返回一个已解决的承诺,一个承诺是的,您正在得到一个承诺,但您需要执行解决它的最后一步(或者可能)
<>你这样做的方式是好的,这就是我在使用<代码> $HTP时所做的事情,但是第一个代码段是我们将要搜索的一个代码,当我们需要用<代码> $HTTP<代码>或强迫其他服务与“工作”或“类似工作”Ajax做不同的事情时,我会考虑这一点。但是,它确实会使您不需要从控制器了解
$http
对象(即,您不需要知道实际需要的数据是响应。数据,而不仅仅是数据),您通常使用的方法更好、更干净,我认为使用第二种方法没有任何好处$http
已经返回了一个承诺,为什么要创建一个新的承诺?您正在将一个已解决的承诺添加到已解决的承诺中,这只是多余的$q、 延迟()更适用于那些还没有承诺的事情。