2017-06-07 136 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

相關問題