2015-10-26 18 views
-1

有一個場景,我們有一個循環,並在循環內我們需要調用http服務來獲取有關信息循環中的每個項目。
然後基於服務調用的結果,我們需要評估和執行其他工作,然後繼續循環中的每個元素。
據我所知,由於服務調用的同步性質,這不會起到編碼的作用,服務調用本身就是一種承諾。
只看最好的角度來實現這一點。在過去,我用$q.all但我不得不做多個循環,它似乎使用$q.all完成。需要從內部循環調用角度http服務,並在執行代碼之前等待服務的值返回以下調用

 _($scope.searchResult) 
     .each(function (results) { 
      var specialInfo = myService.getInfo(results); // http service call 
      if(specialInfo.length > 0){ 
      // Do something 
      } 
      else 
      { 
      // Do something else 
      } 
     }); 

請注意任何人迴應我需要服務返回之前繼續前進,因爲如果條件滿足,我會顯示模式。上面的代碼是僞代碼,我知道。然後在getInfo上丟失了,但你明白了。在檢查循環中的下一個項目之前,每個循環都可能需要用戶輸入才能繼續。

+0

不要把增編在評論...更新問題本身 – charlietfl

+0

更何況你可以停止這個循環用戶輸入。沒有意義 – charlietfl

+0

不確定你的意思?這將做一些邏輯並打開一個模式,如果符合標準,不知道什麼是沒有意義的。 – maguy

回答

0

調整你的代碼,所以沒有環路,但遞歸異步調用:

var currentIndex = 0; 
function processNext() { 
    if (currentIndex >= $scope.searchResult.length) { 
     return; 
    } 

    var next = $scope.searchResult[currentIndex++]; 
    myService.getInfo(next).then(function (response) { 
     var specialInfo = response.data; 
     if (specialInfo.length > 0) { 
      // something 
     } else { 
      // something else 
     } 

     processNext(); 
    }); 
} 

processNext(); 

或者,您可以獲取所有先承諾,然後一次處理它們一個。請記住,這種方法不會被告知,如果對答覆做異步處理(比如從一個模態等待輸入或執行後續請求):

var promises = $scope.searchResult.map(function (result) { 
    return myService.getInfo(result); 
}); 

$q.all(promises).then(function (responses) { 
    responses.each(function (response) { 
     // do stuff 
    }); 
}); 
0

要訪問一個承諾的結果,您可以使用then()

_($scope.searchResult) 
    .each(function (results) { 
     myService.getInfo(results).then(function(response) { 
      var specialInfo = response.data; 
      if(specialInfo.length > 0) { 
       // Do something 
      } 
      else { 
       // Do something else 
      } 
     }); 
    }); 
+0

是的,理解然後,但我的問題是,我需要的服務返回時,它每次都有數據回來,而不是繼續循環,直到它有數據。部分代碼將執行某些操作,以顯示用戶將要與之交互的模式彈出窗口,因此每個循環可能需要用戶在移至循環中的下一個項目之前回答模態問題。 – maguy

+1

這是不可能的。您不能使異步調用同步。該服務無法返回數據。它所能回報的只是一個承諾。您的服務可能會返回第一個元素的承諾,調用者會註冊一個回調以顯示模式。當模式服務解決後,您將再次使用下一個元素來調用服務,這將返回另一個承諾等。 –

+0

我知道這是不可能的,因爲它是異步的,這就是爲什麼我張貼替代品。 – maguy