angularjs $ q&关于承诺的$ http

时间:2016-01-19 05:58:16

标签: angularjs http promise angular-promise

关于官方文档中的$ 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来返回一个承诺?

3 个答案:

答案 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闪烁。

推荐:官方文件