angularjs – Angular:返回$q.defer().promise而不是$http 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;
        }
    };
});

我通常会这样写:

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

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

不,没有优势,它是一样的,在你的第一个代码剪断你创建了一个 $q.defer()实例然后你调用它的resolve()方法来创建一个已解决的promise.

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

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

但并非所有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.

相关文章

AngularJS 是一个JavaScript 框架。它可通过 注:建议把脚本放在 元素的底部。这会提高网页加载速度,因...
angluarjs中页面初始化的时候会出现语法{{}}在页面中问题,也即是页面闪烁问题。出现这个的原因是:由于...
AngularJS 通过被称为指令的新属性来扩展 HTML。AngularJS 指令AngularJS 指令是扩展的 HTML 属性,带有...
AngularJS 使用表达式把数据绑定到 HTML。AngularJS 表达式AngularJS 表达式写在双大括号内:{{ expres...
ng-repeat 指令可以完美的显示表格。在表格中显示数据 {{ x.Name }} {{ x.Country }} 使用 CSS 样式为了...
$http是 AngularJS 中的一个核心服务,用于读取远程服务器的数据。读取 JSON 文件下是存储在web服务器上...