【问题标题】:Do Angular JS $http promises to behave like true $q promises?Angular JS $http 是否承诺表现得像真正的 $q 承诺?
【发布时间】:2013-09-10 16:37:41
【问题描述】:

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

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

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

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

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

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

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

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

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

【问题讨论】:

  • 我猜这是设计使然:Promise 通常只用一个值实现,因此您需要传递整个响应对象以使其可访问。

标签: javascript angularjs promise angularjs-service


【解决方案1】:

ng.$http

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

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

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

【讨论】:

  • @Rik。是的。如果你使用$resource,它会返回一个包装好的promise,可以直接应用于scope。
  • 首先,您上面的示例在功能上类似于我的 getV2 方法。另外,将其保留在服务内部而不将整个响应对象暴露给控制器是不明智的吗?
  • R.e. $resource:这很有趣!没遇到过这种服务!会去玩!非常感谢。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-12
      • 2016-04-24
      • 1970-01-01
      • 2015-02-25
      • 1970-01-01
      • 2015-04-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多