У меня есть массив, заполненный вызовами функций (т. Е. func(param);
), например:
var array = [
func(param),
func(param),
func(param)
];
В какой-то более поздний момент я хочу вызвать все эти вызовы функций одновременно.Как я могу это сделать?
Я знаю, что вы можете запустить функцию для каждого элемента в массиве с циклом for или forEach, например:
for (var i = 0; i < 10; i++) {
// do stuff
}
Или
arrayName.forEach(function(e) {
// do stuff
});
Но я не уверен, как это закодировать, чтобы он вызывал?
Я попробовал следующее, но я получаю сообщение об ошибке «arrayName [i] не является функцией».
for (i = 0; i < arrayName.length; i++) {
arrayName[i]();
}
РЕДАКТИРОВАТЬ: ТРИ РЕШЕНИЯ
1: BEST, использует цикл while
Вот основной код:
var soundsWaitingForNextBar = [];
while (soundsWaitingForNextBar.length > 0) {
soundsWaitingForNextBar[0](); // call first item in array
soundsWaitingForNextBar.shift(); // remove first item in array
}
Вот более углубленная версия, в которой элементы помещаются в массив каждую секунду, а массив очищается только каждые десять секунд:
var soundsWaitingForNextBar = [];
function foo() {
console.log('')
} // just making sure foo is a function
// pusing some functions into the array
soundsWaitingForNextBar.push(() => foo());
soundsWaitingForNextBar.push(() => foo());
setInterval(function() { // pushing items to array periodically to make sure the while loop is only emptying when it is called by setInterval and not every time an item is added to the array
soundsWaitingForNextBar.push(() => foo());
}, 2000);
setInterval(function() {
// this while loop does the magic: it calls and removes each item in the array
while (soundsWaitingForNextBar.length > 0) {
soundsWaitingForNextBar[0](); // call first item in array
soundsWaitingForNextBar.shift(); // remove first item in array
}
}, 10000);
setInterval(function() { // just checking to see how/when items are added to the array and emptied
console.log('array.length: ' + soundsWaitingForNextBar.length);
}, 1000);
2: использует array[0]();
для вызова каждого элемента / функции массива.
const func = console.log;
const param = 'foo';
const array = [
() => func(param),
() => func(param),
() => func(param)
];
console.log(array.length); // just noting the original array length
arrayLength = array.length;
for (let i = 0; i < arrayLength; i++) {
array[0]();
array.shift();
}
console.log(array.length); // just making sure the array is empty
3: использует array.forEach(fn => fn());
для вызова каждого элемента / функции массива.
const func = console.log;
const param = 'foo';
const array = [
() => func(param),
() => func(param),
() => func(param)
];
console.log(array.length); // just noting the original array length
array.forEach(fn => fn()); // calls each array item/function
arrayLength = array.length;
for (let i = 0; i < arrayLength; i++) {
array.shift();
}
console.log(array.length); // just making sure the array is empty
Примечание: в цикле for, который я первоначально использовал для удаления элементов из массива с помощью .splice
, я использовал array.length
.Например: for (let i = 0; i < array.length; i++)
.Это не сработало (я не уверен почему), поэтому я решил определить длину массива перед циклом for, используя arrayLength = array.length;
.Теперь программа работает как задумано.