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

时间:2013-09-06 14:26:37

标签: javascript angularjs promise angularjs-service

我知道Angular可以处理控制器内的promise。例如:

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

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

但是,虽然 $ http.get()方法返回一个promise,但我无法以这种方式工作。例如:

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

get方法返回的'promise'有一个 success 方法,该方法接受一个函数,该函数分配了一个人希望分配给 myvar <的数据/强>

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

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

我在这里做错了吗?或者这是“按设计”?

3 个答案:

答案 0 :(得分:1)

ng.$http

  

$ http服务是一个带有单个参数的函数 - a   配置对象 - 用于生成HTTP请求和   使用两个$ http特定方法返回一个promise:成功和错误。

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

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

答案 1 :(得分:1)

then是一般承诺函数,它接受成功和错误回调,并获得已解析的值,无论它是什么。 successerror$http特有的,并且是then的别名,但有一个例外:它们设置了一堆有用的参数而不仅仅是数据。请参阅the source

答案 2 :(得分:0)

这是设计的。您的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;
   }
}