关于官方文档中的$ http:
$ http API基于$ q公开的延迟/承诺API 服务。
$ http服务是一个带有单个参数的函数 - a 配置对象 - 用于生成HTTP请求和 返回承诺
以下代码的含义是什么:
var deferred = $q.defer();
var promise = deferred.promise;
var progress;
$http.get("https://api.github.com/repos/angular/angular.js/pulls")
.success(function(data){
var result = [];
for(var i = 0; i < data.length; i++){
result.push(data[i].user);
progress = (i+1)/data.length * 100;
deferred.notify(progress);
}
deferred.resolve(result);
})
.error(function(error){
deferred.reject(error);
});
return promise;
如果$ http返回一个承诺,我为什么要使用$ q来返回一个承诺?
答案 0 :(得分:1)
使用$http
服务的推荐方法如下:
$http({
method: 'GET',
url: '/someUrl'
}).then(function successCallback(response) {
// success code here
}, function errorCallback(response) {
// error handling code here
});
在这种情况下,您不必返回新的承诺,但只能将调用结果返回到then()
,如您所料。
但是,success()
方法是一种方便的方法,它将响应对象的字段作为单独的参数传递:
.then(function(response) {
// do something with response.data, response.status, etc.
})
VS
.success(function(data, status, headers, config) {
// do something with data, status, etc.
})
但是,与then()
相比,success()
不会返回承诺。我不建议使用它而我刚刚在the docs中看到它现在已被弃用。
更新:我认为在您提供的示例中构建另一个承诺的原因并不是success()
可以使用,而是可以调用deferred.notify(progress)
。如果没有明确地创建另一个承诺,您将无法访问deferred
对象。
答案 1 :(得分:0)
$ http正在返回一个我们使用的承诺,因此取得了成功&#39; (也可以使用&#39;然后&#39;)。如果您在服务中使用此$ http调用并从您的控制器调用此服务方法,那么您将希望从该方法返回一个promise,因此您可以使用.then和.catch等
答案 2 :(得分:0)
通过调用$ q.defer()构造deferred的新实例。 延迟对象的目的是公开关联的Promise实例以及API
可用于表示成功或不成功完成情况,以及 任务。
$ q与$ rootScope.Scope范围模型观察机制集成在角度中,这意味着更快地将分辨率或拒绝传播到模型中,避免不必要的浏览器重绘,这将导致UI闪烁。
推荐:官方文件