链接多个http调用循环

时间:2014-10-12 05:23:39

标签: angularjs angular-promise

我发现了各种关于$ q,$ q.all和链接的有用帖子/信息,但我没有找到任何关于我确切问题的例子,所以我想知道我是否想要什么要做甚至可能。我需要进行一系列调用,每个调用依赖于前一个但是在中间有一个步骤,系列分成几个相似之处。它的要点是这样的:

call #1: get keyword (based on inputs)
call #2: with keyword, get list of items
call #3: with item ID#s, get item profiles
call #4: with data in profiles, get item images

(我知道,我知道,只有一个的四个电话是荒谬的,更不用说总共十六个电话,但这是一个原型。我不需要超速。我只需要证明我可以得到使用现有数据/调用进行最后一步。)

无论如何,这意味着#1是对所有人的一次通话......然后从#2开始,它会分开,我必须为每个不同的ID做#2,#3和#4# #1回归。我用jsonplaceholder嘲笑了一个插件。它应该检索第一个集合,然后使用检索到的ID执行接下来的两个调用,每个ID一个循环。

我尝试过一个简单的for循环(Plunker告诉我,我不能用它做一个函数)。我已经尝试过angular.forEach(在$ scope.watch内部和它之外),但这似乎没有给我任何东西:

angular.forEach($scope.resultsb, function(value, key) {
  console.log(key + ': ' + value);
  $http.get('http://jsonplaceholder.typicode.com/users?id='+ value)
  .then(function(res2){
    $scope.data2 = res2.data;
      var obj = {
        title: $scope.results1[i].title,
        id: $scope.data2[i].id,
        username: $scope.data2.username
      };
  $scope.results2.push(obj);

我认为forEach只是没有正确地使用b / c它直到我得到$ scope.results1(第一步的结果)之后它才能真正运行,但是我可以将$ http链接链接到循环吗?

你可以在http://plnkr.co/edit/CjXt7E?p=preview看到完整的东西(在当前版本中,可能会在我继续击败之后发生变化)。我正在尝试甚至是可能的,还是我必须长期做这件事?

2 个答案:

答案 0 :(得分:0)

你的每个人都会在没有响应的情况下运行,因为它是异步的,而是在你得到回调函数时调用它.then()

编辑你的傻瓜:http://plnkr.co/edit/mxvvCB?p=preview

像这样:

$scope.Call = function(value) {
    if(typeof value[$scope.counter] !== 'undefined'){
    value = value[$scope.counter].id;
    var i =$scope.counter;
    console.log(value+' ' +i);
    $http.get('http://jsonplaceholder.typicode.com/users?id='+ value)
    .then(function(res2){console.log(res2);
      $scope.data2 = res2.data;
        var obj = {
          title: $scope.results1[i].title,
          id: $scope.data2[0].id,
          username: $scope.data2.username
        };
    $scope.results2.push(obj);

    $scope.counter++;
    $scope.Call($scope.resultsb);
    });
    }
  };

我希望这是你想要实现的目标。

答案 1 :(得分:0)

我认真工作。

这可能是功能使用最糟糕的情况,但它有效,我得到了结果。不完全 - 我认为一些电话会超时,所以我想出了我需要要求的,比如6,然后我至少得到了我想要的4个结果。这可能表明这种情况迫切需要单个端点而不是在前端执行逻辑,但它足以用于原型,所以我很高兴(现在)。

在我的控制器中,我得到第一组ID,并使用一个简单的for循环,我为每个分配一个循环id。然后我调用getUser(),使用num(将信息连接到第一组结果)和id(连接到实际用户I' m)。这是其内部链的功能:

function getUser(num, id) {

$http.get('http://jsonplaceholder.typicode.com/users?id='+ id)
.then(function(res2){
  $scope.data2 = res2.data;
  if ($scope.data2[0].username !== 'undefined') {
    var obj = {
      num: $scope.results1[num].num,
      id: $scope.results1[num].id,
      title: $scope.results1[num].title,          
      username: $scope.data2[0].username
    };
    $scope.results2.push(obj);
  }

  return $http.get('http://jsonplaceholder.typicode.com/comments?id=' + id);
  }).then(function(res3){
    if ($scope.results2[num].username !== 'undefined') {
      $scope.data3 = res3.data;
      var obj = {
        num: num,
        id: $scope.results2[num].id,
        title: $scope.results2[num].title,
        username: $scope.results2[num].username,
        email: $scope.data3[0].email
      };
      $scope.results3.push(obj);
    }
  });
}

您可以在http://plnkr.co/edit/CjXt7E?p=preview看到整个事物 - 它显示每个步骤的输出(results1,results2,results3)。希望我不必再做一些疯狂的事情,但为了以防万一,也许这会对某人有所帮助。或者它可能会让某人跳起来告诉我我做错的一切,但那也没关系。得以某种方式学习。 :)