Javascript如何在forEach完成执行后运行一些代码

Javascript如何在forEach完成执行后运行一些代码,javascript,angularjs,foreach,Javascript,Angularjs,Foreach,所以我想用ng show打开和关闭加载gif。我特别想在我的脚本通过forEach加载完数组后关闭它 当forEach完成其整个周期时,如何运行代码。类似于.then,但用于循环 所以forEach不是异步的。因此,你可以直接写下: function selectAll(bool) { vm.selectAllSpinner = true; vm.practicesLeftCol = []; if(bool === true){

所以我想用ng show打开和关闭加载gif。我特别想在我的脚本通过forEach加载完数组后关闭它

当forEach完成其整个周期时,如何运行代码。类似于.then,但用于循环

所以forEach不是异步的。因此,你可以直接写下:

function selectAll(bool) {
          vm.selectAllSpinner = true;
          vm.practicesLeftCol = [];
          if(bool === true){
            vm.practices.forEach(function(practice){
              practice.selected = true;
              vm.practicesLeftCol.push(practice)
            })
          } else if (bool === false){
            vm.practices.forEach(function(practice){
              practice.selected = false;
              vm.practicesLeftCol = [];
            })
          }
    vm.selectAllSpinner = false;
}
话虽如此,我认为可以对代码进行总体清理,使其更像:

  function selectAll(bool) {
    vm.selectAllSpinner = true;
    vm.practicesLeftCol = [];
    if (bool) {
      vm.practicesLeftCol = vm.practices.reduce(function(memo, practice) {
        practice.selected = true;
        memo.push(practice);
        return memo;
      }, []);
    }
   vm.selectAllSpinner = false; 
}

再说一次,reduce和forEach都不是异步的,所以这应该可以正常工作…

在Javascript中,使用分号;分隔符(可选后跟换行符),用于将命令附加到上一个命令。因此

function selectAll(bool) {
    vm.selectAllSpinner = true;
    vm.practicesLeftCol = [];
    if(bool === true){
        vm.practices.forEach(function(practice){
            practice.selected = true;
            vm.practicesLeftCol.push(practice)
        });
        vm.selectAllSpinner = false;  //<---
    } else if (bool === false) {
        vm.practices.forEach(function(practice){
            practice.selected = false;
            vm.practicesLeftCol = [];
        });
        vm.selectAllSpinner = false; //<---
    }
}

不幸的是,forEach没有回调-但您可以执行以下操作:

  if(bool === true){
        vm.practices.forEach(function(practice){
          practice.selected = true;
          vm.practicesLeftCol.push(practice);
           items++;
           if(items === your_array.length) {
             vm.selectAllSpinner = false;
           }
        })

      }

因为forEach循环所做的计算是微不足道的,所以您甚至不会看到微调器出现。我认为微调器出现了,但肉眼看不到。不,它没有-需要启动“消化循环”来显示微调器,并且在其值再次设置为false后它会这样做。这只是一个惯例。行终止符有时会导致自动插入分号JavaScript主要在单线程中运行,您应该将代码放在forEach调用之后…它将无法工作,因为angular必须启动摘要循环,当它选择AllSpinner时将为false。我尝试了它,但不幸的是,它无法工作。它在包含forEach循环的if语句之前激发两次。可能是因为@pwolaq saidI不知道角度在这里有多重要?我没有看到对$scope的调用,我们正在对某种类型的全局变量进行设置……是的,但是微调器是通过ng show directiveAh基于此变量显示的。这是一个好的观点。我可能很密集,但为什么不将vm存储在$scope上呢@IWI
  if(bool === true){
        vm.practices.forEach(function(practice){
          practice.selected = true;
          vm.practicesLeftCol.push(practice);
           items++;
           if(items === your_array.length) {
             vm.selectAllSpinner = false;
           }
        })

      }