2017-05-28 171 views
0

我看到有关此问题的其他问题,但没有帮助我。angularjs中的http请求无限循环

我有功能angularjs控制器:

$scope.getUser = function(id){ 
    ret = null; 
    $http.get('services/rest/users/' + id).then(
     function(response){ 
      ret = response.data.name; 
     }, 
     function(response){ 
     } 
    ) 
     return ret; 
} 

我调用该函数在HTML:

<div ng-repeat = "move in moves">Player:<span> {{getUser(move.player_id)}} </span> - {{move.guess}} - {{move.answer}}</div> 

,这将创建'services/rest/users/' + id请求的无限循环。我看到角度可以做到这一点,当范围内的某个对象总是在变化,但我没有看到这里。

+0

是不是它是由于摘要循环一次又一次地被调用,只要你的一个请求(后端)正在完成?这可以再次调用ng-repeat指令。 –

+2

首先,使用$ q获取用户的承诺,并解决是否响应或拒绝,如果错误。其次,在ng-repeat中调用多个http请求是一种不好的做法。如果可以,并且数据准备就绪时,请将数据带入一个请求中,填充绑定到移动范围变量的数组。 –

+1

即使没有'ng-repeat',它也会循环。我从另一个地方调用了该函数,并且它又开始循环。将尝试'$ q'。 – wdc

回答

3

方法是错误的。

$http是异步的,从getUser()

返回切勿认为直接进行异步请求使用功能时ret永远是零。

相反,在控制器(或服务更好的)遍历所有的moves,要求玩家数据,并补充说,因为每个move

function getUser(id) { 
    return $http.get('services/rest/users/' + id).then(function(response) { 
    return response.data.name; 
    }).catch(function() { 
    return 'Unknown Player'; 
    }) 
} 


angular.forEach($scope.moves, function(move){ 
    getUser(move.player_id).then(function(player){ 
     move.player = player; 
    }); 
}); 

查看物业:

<div ng-repeat = "move in moves">Player:<span> {{move.player)}} </span>...</div>