2017-05-28 10 views
0

これについて他の質問がありましたが、私は助けになりませんでした。URLの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

ではありませんあなたの1つのリクエスト(バックエンド)が完了するたびに、ダイジェストサイクルが何度も何度も呼び出されています。これは、ng-repeatディレクティブを再び呼び出すことができます。 –

+2

まず、$ qを使用してユーザーに約束をし、応答の場合は解決し、エラーの場合は拒否します。次に、ng-repeatで複数のhttpリクエストを呼び出すことは悪い習慣です。可能であれば、データが1つの要求でデータを取り込み、データが準備できたら、movesスコープ変数にバインドされた配列を設定します。 –

+1

'ng-repeat'がなくてもループします。私は別の場所からその機能を呼び出し、再びループを開始しました。 '$ q'で試してみます。 – wdc

答えて

3

アプローチが間違っています。

$httpは非同期であり、直接の非同期要求を行うビューの機能を使用しないでくださいgetUser()

から戻ったときretは常にnullになります。

代わりに、コントローラ(またはより良いまだサービス中)にすべての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>