gpt4 book ai didi

angularjs $q & $http 关于 promise

转载 作者:可可西里 更新时间:2023-11-01 17:34:50 24 4
gpt4 key购买 nike

关于$http的官方文档:

The $http API is based on the deferred/promise APIs exposed by the $q service.

The $http service is a function which takes a single argument — a configuration object — that is used to generate an HTTP request and returns a promise

那么下面的代码是什么意思:

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 返回一个 promise ,我为什么要使用 $q 返回一个 promise ?

最佳答案

使用$http服务的推荐方式是这样的:

$http({
method: 'GET',
url: '/someUrl'
}).then(function successCallback(response) {
// success code here
}, function errorCallback(response) {
// error handling code here
});

在这种情况下,您不必返回新的 promise ,而可以像您期望的那样将调用结果返回给 then()

但是,success() 方法是一种便捷方法,它已将响应对象的字段作为单独的参数传递:

.then(function(response) {
// do something with response.data, response.status, etc.
})

对比

.success(function(data, status, headers, config) {
// do something with data, status, etc.
})

但是,与 then() 不同,success() 不返回 promise 。我不建议使用它,我刚刚在 the docs 中看到,它现在已被弃用。

更新:我认为在您提供的示例中构造另一个 promise 的原因不是可以使用 success() 而是调用 deferred .notify(progress) 是可能的。如果不显式创建另一个 promise ,您将无法访问 deferred 对象。

关于angularjs $q & $http 关于 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34869482/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com