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

dip*_*rus 8 angularjs angular-http angular-promise

观看了很多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;
        }
    };
});
Run Code Online (Sandbox Code Playgroud)

我通常会这样写:

.factory('myFact', function($http) {
    return {
        getData: function() {
            return $http.get('/path/to/api')
                .then(function(res) {
                    return res.data;
                });
        }
    };
});
Run Code Online (Sandbox Code Playgroud)

返回$q.defer()承诺而不是$http承诺是否有任何好处?这些方法与我相同.

Sal*_*ani 4

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

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

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

但并非所有 AngularJs 服务都会为您完成这项工作,$resource例如,可以查看一下,它包装$http用于 RESTful Web API 场景。$resource不会返回已解决的承诺承诺是的,您将得到一个承诺,但您需要执行解决它的最后一步(检查此堆栈问题,也许还有这篇有关 Amber Kaplan 自己使用 Rest 的经验的文章)。

因此,您的做法很好,这也是我在使用时的做法$http,但是当我们需要以不同的方式做事$http或强迫其他人做事时,我们都会搜索第一个片段代码。 “与 AJAX 一起工作”或“像 AJAX 一样工作”的服务。