Angularjs 角度:返回$q.defer().promise而不是$http promise

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) {

通过观看大量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
承诺有什么好处?这些方法对我来说都是一样的。

不,没有优势,都是一样的,在你的第一个代码片段中,你创建了一个实例,然后你调用了它的
resolve()
方法来创建一个已解决的承诺

这就是在异步处理函数和将来的对象时,您需要知道并传递throw-inangularJs的过程,这些对象在将来的某个时刻将具有不同的值或新数据,您需要知道何时发生,因为应用程序中的相关方可能需要访问结果任务完成时延迟的任务

现在,在使用时,您不必执行任何操作,因为它已经返回了一个已解决的承诺,您可以直接调用它的方法,除非您有不同的方法来做事情,并且需要实现不同的方法

但并不是所有的angularJs服务都能为您完成这项工作,比如看一下
$resource
,它包装了
$http
,用于RESTfulWebAPI场景
$resource
不会返回一个已解决的承诺,一个承诺是的,您正在得到一个承诺,但您需要执行解决它的最后一步(或者可能)


<>你这样做的方式是好的,这就是我在使用<代码> $HTP时所做的事情,但是第一个代码段是我们将要搜索的一个代码,当我们需要用<代码> $HTTP<代码>或强迫其他服务与“工作”或“类似工作”Ajax做不同的事情时,我会考虑这一点。但是,它确实会使您不需要从控制器了解
$http
对象(即,您不需要知道实际需要的数据是
响应。数据
,而不仅仅是
数据
),您通常使用的方法更好、更干净,我认为使用第二种方法没有任何好处
$http
已经返回了一个承诺,为什么要创建一个新的承诺?您正在将一个已解决的承诺添加到已解决的承诺中,这只是多余的$q、 延迟()更适用于那些还没有承诺的事情。