2017-09-04 3 views
0

shouldPermittrueになる場合、getModelDataへの繰り返し呼び出しを停止します。しかし、以下のコードでは、それぞれnewlySelectedUsersのコンソールにwhy I got printed forEach newlySelectedUsersが表示されます。ループ内のサービスコールは、条件が偽であってもループを停止しません。

shouldPermitが真になると getModelDataへの呼び出しを停止する方法
var shouldPermit = false; 
angular.forEach(newlySelectedUsers, function(value, key) { 
if(!shouldPermit) { 
console.log("why I got printed forEach newlySelectedUsers")       
userService.getModelData($scope.$root.test[value].id) 
.success(function (data) {         
    if(lodash.isEmpty(data)) {          
     shouldPermit = true; 
     $scope.insertSaving(); 
    } 
     });       
     }      
      }); 

答えて

0

。 Beeingは、あなたの反復は、サービスが空のデータ変数を(あなたのケースでは)見つけるために必要な時間よりも速く実行されると言いました。

オプションは再帰的にコールhttpリクエストにされています

const totalNewlySelectedUsers = newlySelectedUsers.length; 


function getUser(idx) { 

    let value = newlySelectedUsers[idx]; 

    userService.getModelData($scope.$root.test[value].id) 
     .success(function (data) { 
      if (lodash.isEmpty(data)) 
       $scope.insertSaving(); 
       return; 
      } 

      if(idx === totalNewlySelectedUsers) return; 

      getUser(idx + 1); 
     }); 

} 

getUser(0); 
0

これは非同期のためです。 2番目の反復は、最初の反復が終了するまでuserService.getModelData()が呼び出されるのを待機しません。したがって、最初の反復の成功関数(userService.getModelData())に行く前であっても、shouldPermitをtrueに変更しても、コンソールメッセージが表示されます。

代わりに、shouldPermit = true;を先頭に移動して問題を解決してください。

すべてのHTTPリクエストがasynchronuslyを実行しているためだ
var shouldPermit = false; 
angular.forEach(newlySelectedUsers, function(value, key) { 
if(!shouldPermit) 
{ 
    console.log("why I got printed forEach newlySelectedUsers"); 
    shouldPermit = true; <--- Moved from success function     
    userService.getModelData($scope.$root.test[value].id) <--- Async Call 
    .success(function (data) {         
    if(lodash.isEmpty(data)) 
    {          
     $scope.insertSaving(); 
    } 
    });       
    }      
    }); 
+0

shouldPermitは、データが空の場合にのみtrueに設定する必要があります。だから私たちは問題を解決するための条件の外に置くことはできません。 –

関連する問題