2017-06-07 144 views
0

所以我想用ng-show开启和关闭我的“加载”gif。在我的脚本通过forEach加载数组后,我特别想关闭它。Javascript如何在forEach完成执行后运行一些代码

如何运行代码时forEach完成它的整个周期。”类似的东西到.then(),但for循环

function selectAll(bool) { 
    vm.selectAllSpinner = true; 
    vm.practicesLeftCol = []; 
    if(bool === true){ 
    vm.practices.forEach(function(practice){ 
     practice.selected = true; 
     vm.practicesLeftCol.push(practice) 
    }) 
    I want this after the foreach ->vm.selectAllSpinner = false; 

    } else if (bool === false){ 
    vm.practices.forEach(function(practice){ 
     practice.selected = false; 
     vm.practicesLeftCol = []; 
    }) 
    I want this after the foreach ->vm.selectAllSpinner = false; 

    } 
+1

因为所做的计算是'forEach'循环是微不足道的,你甚至不会看到飞旋展向上。我认为纺纱工出现,但肉眼不可见。 –

+1

不,它不需要 - 角度需要触发digest循环来显示微调器,并且在它的值再次设置为false后它会这样做 – pwolaq

回答

-1

所以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是异步的,所以这应该只是有点工作...

+1

它不起作用,因为角度必须触发摘要循环,并且当它执行“selectAllSpinner”时再次虚假 – pwolaq

+0

我试过了,它不起作用。它在包含'forEach'循环的'if'语句之前触发两次。可能是由于@pwolaq所说的 – IWI

+0

我没有看到角度在这里特别重要吗?我没有看到$ scope的调用,我们将其设置为某种全局变量... –

-2

在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; //<--- 
    } 
} 
+0

这只是一个约定。行终止符导致自动分号插入有时 – Hydro

-3

不幸的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; 
      } 
     }) 

     } 
+0

JavaScript运行在单线程(主要),你应该只是把你的代码后forEach调用... – pwolaq

相关问题