2

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

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

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

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

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

get 方法返回的“承诺”有一个success方法,该方法采用一个函数,该函数分配了希望分配给myvar的数据。

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

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

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

4

3 回答 3

1

ng.$http

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

$http返回一个承诺,所以你需要链接then来获取数据。

IPService.getV1().then(function (response) {
    console.log(response)
    $scope.value1 = response.data;
});
于 2013-09-06T14:35:55.403 回答
1

then是一个通用的 promise 函数,它接受一个成功和错误的回调,然后你得到解析的值,不管它是什么。success并且error$http特定的,并且是一个例外的别名then:它们设置了一堆有用的参数而不仅仅是数据。查看源代码

于 2013-09-06T14:39:40.890 回答
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;
   }
}
于 2013-09-06T15:34:12.337 回答