【问题标题】:service call inside loop doesn't stops loop even if condition is false即使条件为假,循环内的服务调用也不会停止循环
【发布时间】:2017-09-04 16:46:03
【问题描述】:

如果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 的调用?

【问题讨论】:

    标签: angularjs foreach asynchronous-javascript


    【解决方案1】:

    这是因为所有的 http 请求都是异步运行的。也就是说,您的迭代运行速度比服务查找(在您的情况下)空数据变量所需的时间快。

    一种选择是递归地调用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);
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • shouldPermit 应仅在数据为空时设置为 true。所以我们不能把它放在解决问题的条件之外。
      猜你喜欢
      • 2016-03-14
      • 2023-03-25
      • 2014-03-30
      • 1970-01-01
      • 2020-04-15
      • 2021-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多