Angular JS$http承诺表现得像真正的$q承诺吗?

Do Angular JS $http promises to behave like true $q promises?

本文关键字:承诺 http JS Angular      更新时间:2023-09-26

我知道Angular可以处理来自控制器内部的承诺。 例如:

function MyCtrl($scope) {
  $scope.myvar = getDeferredPromise();
}

主角度摘要循环优雅地处理这个问题,将延迟函数最终返回给 myvar 的任何值分配。

但是,尽管 $http.get() 方法返回了一个承诺,但我无法让它以这种方式工作。 例如:

function MyCtrl($scope, $http) {
  $scope.myvar = $http.get('/url');
} 

get 方法返回的"promise"有一个成功方法,该方法采用一个函数,该函数分配了希望分配给 myvar 的数据。

但是,它还有一个 then 方法 - 但它给定整个响应对象 - 而不仅仅是数据部分! 这似乎最终被分配给了myvar

这个小提琴可能会有所帮助:http://jsfiddle.net/QKnNC/1/

我在这里做错了什么吗?或者这在某种程度上是"设计使然"?

ng.$http

$http服务是一个接受单个参数的函数 — 配置对象 — 用于生成 HTTP 请求和 返回具有两种$http特定方法的承诺:成功和错误。

$http返回一个承诺,因此您需要链接then以获取数据。

IPService.getV1().then(function (response) {
    console.log(response)
    $scope.value1 = response.data;
});
then

通用的 promise 函数,它接受成功和错误回调,你会得到解析的值,无论它是什么。 successerror $http特定于的,并且是then的别名,但有一个例外:它们设置了一堆有用的参数,而不仅仅是数据。见源头。

这是设计使然。 您的getV2()方法就是您想要的。 由于您使用的是 GET,因此您可以保存您的承诺结果,并在后续调用 getV2() 时返回该结果:

var v2promise, v2data;
return {
   getV2: function() {
      if(!v2promise) {
        v2promise = $http.get('http://ip.jsontest.com/').then(
          function(response) {
             v2data = response.data;
             return v2data;
        });
      }
      return v2promise;
   }
}