0

我想停止对getModelDataifshouldPermit的重复调用true。但下面的代码总是在控制台中打印why I got printed forEach newlySelectedUsers每个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成为真的?

4

2 回答 2

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();
     }
     });                           
     }                      
   });
于 2017-09-04T17:05:08.337 回答
0

那是因为所有的 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);
于 2017-09-04T17:13:06.567 回答