2016-06-23 9 views
1

私はこの質問が既にどこかで答えられていることは知っていますが、私のものを働かせることはできません。ループ内で非同期呼び出しを処理する方法は?

YammerFunctionality.getMessagesInThread(msg.id,$scope.older_ID).then(function(response){ 
      var obj=response.data.messages; 
      var messages=[]; 
      var reverseMessage=obj.reverse(); 
      var promises=[]; 
      for(var i=0;i<reverseMessage.length;i++){ 
       var deferred = $q.defer(); 
       promises.push(deferred.promise); 
       if(reverseMessage[i].replied_to_id) { 
        YammerFunctionality.getUserInfo(reverseMessage[i].sender_id).then(function(response){ 
         reverseMessage[i].sender_name=response.data.full_name; 
         messages.push(reverseMessage[i]); 
         deferred.resolve(); 
        },function(error){ 
         deferred.reject(error); 
        }); 
       } 
      } 
      $q.all(promises).then(function() { 
       console.info('All resolved'); 
       $state.go('yammermessage',{messages:messages}); 
      },function(){ 
       showAlert("Thread error"); 
      }); 

    },function(error){ 
     showAlert("Yammer Error while opening Thread."); 
    }); 

私は特定のスレッドからすべてのメッセージを取得しようとしていますが、一度私は同じユーザーの詳細を取得しようとしています。 問題は私がスレッドを取得し、ユーザサービスを呼び出すときに、ユーザサービスが実行されるまでに最後のカウントまでインデックスが移動してしまい、コードが壊れてしまうという問題があります。

reverseMessage[i].sender_name

は、私は、配列の最後の位置に移動したので、 "reverseMessage [I]は、" 定義されていないと言います。 [長さ20の場合、i = 20でデータがありません] ヘルプがありがとうございます!

+0

あなたは_ _「この質問はすでに何らかの方法で答えている」と言うとき、見とる権利です[**をこちら**](http://stackoverflow.com/questions/13343340/calling-ループ内の非同期関数)と[**ここ**](http://stackoverflow.com/questions/11488014/asynchronous-process-inside-a-javascript- forループ)。 – Rohit416

+0

私はAngular promiseについて話しています。ダイレクトコールバックの使用は推奨されていません – Anand

+0

これはあなたの選択です。AngularはJavaScriptの背後にあるので、JSで考えることができるものはすべて動作します。私の提案はクロージャを使用することです。 – Rohit416

答えて

0

約束の中で変数iを使用することはできません。クロージャー関数を作成し、その関数に変数を渡す必要があります。以下のコードを試してみてください。

for(var i=0;i<reverseMessage.length;i++){ 
      var deferred = $q.defer(); 
      promises.push(deferred.promise); 
     function closure(i){  
      if(reverseMessage[i].replied_to_id) { 
       YammerFunctionality.getUserInfo(reverseMessage[i].sender_id).then(function(response){ 
        reverseMessage[i].sender_name=response.data.full_name; 
        messages.push(reverseMessage[i]); 
        deferred.resolve(); 
       },function(error){ 
        deferred.reject(error); 
        }); 
       } 
      } 
closure(i); 
     } 
+0

ありがとうございました。しかし、ループは何度も何度も実行されているので、Yammer APIによると、これは許可されていないため、リクエストがリクエストを行っているので、 "多すぎる複数のリクエスト"が発生します。内部サービスが完了するまでループしますか? – Anand

関連する問題