Angular:返回$ q.defer()。promise而不是$ http promise

时间:2015-03-16 17:28:10

标签: 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) {
                    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承诺是否有任何好处?这些方法与我相同。

1 个答案:

答案 0 :(得分:3)

不,没有优势,它是相同的,在您剪切的第一个代码中,您创建了一个$q.defer()实例,然后您调用了其resolve()方法来创建已解决的承诺

使用异步函数将来的对象时,您将需要了解并传递 angularJs 的过程您将需要知道的某些未来时刻的值或新数据,因为您的应用中的相关方可能需要在完成时访问延迟任务的结果。

现在使用$http时,您不必执行任何操作,因为它已经返回已解决的承诺,您可以直接调用它then() { {3}}方法,除非你有不同的方法来做事,你需要实现不同的方法。

但并非所有angularJs服务都会为您完成工作,例如,请查看$resource,其中包含$http以用于RESTful Web API方案。 $resource不会返回已解决的承诺承诺是的,您将获得一个,但您需要做最后一步解决( check this stack questionthis,也许this article about Amber Kaplan's own experience working with Rest)。

所以你如何做到这一点很好,这也就是我在使用$http时也是这样做的,但第一个代码片段是我们将要搜索的代码。将需要以$http执行不同的操作,或强制其他服务使用' 使用'或者' ' AJAX。