2017-09-04 78 views
0

如果shouldPermit变为true,我想停止重复呼叫getModelData。但下面的代码总是在控制台中打印每个newlySelectedUserswhy I got printed forEach newlySelectedUsers即使条件为假,服务呼叫内循环也不会停止循环

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(); 
    } 
     });       
     }      
      }); 

如何停止呼叫getModelData一次shouldPermit为真?

回答

0

这是因为所有的http请求asynchronusly运行。那个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

这是因为异步。第二次迭代不等待userService.getModelData()要求第一次迭代完成。所以,即使在第一次迭代的成功函数userService.getModelData()之前,您也可以获得控制台消息,并将shouldPermit更改为true。

取而代之,您只需移动shouldPermit = true;即可解决问题。

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。所以我们不能把它放在解决问题的条件之外。 –