【问题标题】:AngularJS return two http get requests only when resolvedAngularJS 仅在解析时返回两个 http get 请求
【发布时间】:2015-08-07 09:15:14
【问题描述】:

我有一个 Angular 应用程序,在控制器中我需要调用一个函数来发出两个 http get 请求,并且我需要这个函数在它们被解析时返回这些值。我不能让它们在 $routeProvider 中解析,因为这个函数需要在同一个控制器中获得一个值。

我展示了控制器的一部分:

function myController(info) {
 var vm = this;
 vm.name = info.data.name;

 vm.extra_data = MyService.getExtras(name);
}

这里是服务的部分代码:

function myService($http, $q, API_EVENT1, API_EVENT2) {
 return {
  getExtras: getExtras
 }

 function getExtras(name) {
  var request1 = API_EVENT1 + '/' + name; 
  var request2 = API_EVENT2 + '/' + name;

 }
}

由于我尝试了几种方法,功能不完整,但我都没有成功。

我的问题是如何返回(在 getExtras 函数中)请求的两个结果。我曾尝试使用 $q.defer、$q.all 和 promises,但我无法实现。

以$q.all为例,我得到了结果,但是当我调用函数时,对象extra_data是未定义的,因为请求是异步执行的。

提前感谢您的回复。

【问题讨论】:

  • 您是否尝试将您的$http responses 存储到一个全局变量中并使用$q.all() 作为收集所有数据时的触发器?
  • 我明白了!我之前尝试过,但我没有正确返回延迟,但现在我解决了它返回之前在 $q.all 成功时解决的延迟。

标签: javascript angularjs


【解决方案1】:

我会使用$q.all 从服务返回组合承诺,并在控制器中处理结果。例如:

function myService($http, $q, API_EVENT1, API_EVENT2) {
  return {
    getExtras: getExtras
  }
  function getExtras(name) {
    return $q.all([
      $http({method: 'GET', url: API_EVENT1 + '/' + name}), 
      $http({method: 'GET', url: API_EVENT2 + '/' + name})])
     );
  }
}

function myController(info) {
  var vm = this;
  vm.name = info.data.name;

  MyService.getExtras(name).then(function(data) {
    vm.extra_data.first = data[0];
    vm.extra_data.second = data[1];
  });
}

【讨论】:

  • 是的,这就是我所做的,或多或少,但在服务中使用 $q.defer()。确实,我认为我以这种方式解决了问题,但问题是在控制器中 vm.extra_data 变量未在以下行中设置,使用 .then 函数,如您所说。我的意思是,它是在这个函数中设置的,具有正确的值,但它在控制器的以下行中是未定义的。
猜你喜欢
  • 1970-01-01
  • 2018-03-06
  • 2016-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-08
  • 1970-01-01
  • 2015-11-22
相关资源
最近更新 更多