2017-03-28 5 views
1

です。ここのコードだ配列に消え値は、要素がオブジェクト

Object {candidates: Array[0], vote_begin: true, department: "机械与运载工程学部", vote_type: "预选", ballot_type: "记分"} 

私たちは、候補者を見ることができる空の配列とするとき、私は、HTTPポストを作るです$ scope.voteDataでリクエストすると、候補は空です。私は詳しく見るときには:

Object 
ballot_type:"记分" 
candidates:Array[4] 
department:"机械与运载工程学部" 
vote_begin:true 
vote_type:"预选" 
__proto__:Object 

を私たちは、候補者は、私が何を期待ので、$ http.postある四つの要素( '/管理/ r_candidate'、POSTDATA)を持って見ることができます返されます。

{status: 0, data: {candidateInfos: [,…], total: 4}} 
data:{candidateInfos: [,…], total: 4} 

なぜ候補者が空の配​​列になるのか分かりません。

答えて

3

これは、async javascriptで繰り返される論理問題です。

あなたは

$scope.get_candidate(); //async data inside 
console.log($scope.voteData); 

を実行すると、それはあなたがあなたが/ success機能

$http.post('/admin/r_candidate', postData) 
    .success(function (response) { 
    console.log(response.data); 
    $scope.voteData.candidates = response.data.candidateInfos; 
}); 

内部の結果を処理することができます$はhttp request

に起因し得るよりもconsole.log()速く実行されますこれは、あなたのanglejsのバージョンに応じて、the .then syntaxを使用する必要があります。

ここ
+0

非同期機能で動作するように$ Qを使用することができ、あなたのコンソール出力を置く非同期メソッドを使用していています:クエリがそれに続く 'console.log'の前に戻ってくるほど速い場合でも、これは問題ではありません。ありがとう。 – SinDeus

+0

"Promise"は私の質問に最適な解決策です –

-1

問題あなたは結果が返される前に、あなたは私が「速い」という言葉の不適切な選択だと思い

function asyncGreet() { 
      var deferred = $q.defer(); 
      var postData = { 
       department: $scope.voteData.department, 
       group: $scope.voteData.group 
      }; 
      $http.post('/admin/r_candidate', postData) 
        .success(function (response) { 
      $scope.voteData.candidates = response.data.candidateInfos; 
      deferred.resolve(); 
        });); 

      return deferred.promise; 
     } 

     var promise = asyncGreet(); 
     promise.then(function() { 
      console.log($scope.voteData); 
     } 
+0

これはうまくいかず、あなたは 'deferred.resolve(...)'を呼び出さなかったのです。さらに、 '$ http.post(...)'がすでに約束を返すときに、なぜ '$ q'で自分自身を悩ませますか?単純な 'return $ http.post(...)'で十分です。 – SinDeus

+0

しかし、http.postを呼び出すのではなく、メソッドを呼び出しています。そのメソッドで$ qを使用しないと、httpの返り値は約束してもいなくても、http postの出力が終了するまで待ちません。 – Heshan

+1

Myポイントは:_method_自体は '$ http.post(...)'の結果を返します。 'function asyncGreet(){return $ http.post(...);} } '。そして_voilà_:D – SinDeus