2016-06-23 31 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,然後我= 20,沒有可用的數據] 幫助表示讚賞!

+0

當你說_「這個問題已經回答了以某種方式」 _,看看[** **這裏(http://stackoverflow.com/questions/13343340/calling-你是對的一個異步函數內的循環在JavaScript)和[**這裏**](http://stackoverflow.com/questions/11488014/asynchronous-process-inside-a-javascript- for循環)。 – Rohit416

+0

我在談論角度承諾。不推薦使用直接回調方法 – 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