Javascript如何在forEach完成执行后运行一些代码
所以我想用ng show打开和关闭加载gif。我特别想在我的脚本通过forEach加载完数组后关闭它 当forEach完成其整个周期时,如何运行代码。类似于.then,但用于循环 所以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){
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;
}
})
}