2017-05-28 124 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>