即使条件为假,循环内的服务调用也不会停止循环

service call inside loop doesn't stops loop even if condition is false

如果 shouldPermit 变为 true,我想停止对 getModelData 的重复调用。但是下面的代码总是在控制台中为每个 newlySelectedUsers.

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

一旦 shouldPermit 变为真,如何停止对 getModelData 的调用?

是因为异步。第二次迭代不会等待第一次迭代调用的 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();
     }
     });                           
     }                      
   });

那是因为所有 http 请求运行 异步。那个蜜蜂说你的迭代 运行s 比服务查找(在你的情况下)一个空数据变量所需的时间快。

一个选项是递归调用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);