Как вызвать каждый элемент массива, когда каждый элемент массива является вызовом функции - PullRequest
0 голосов
/ 22 июня 2019

У меня есть массив, заполненный вызовами функций (т. Е. 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;.Теперь программа работает как задумано.

Ответы [ 4 ]

2 голосов
/ 22 июня 2019

Вам нужно только передать имя функции в массиве

var arrayName = [
  func,
  func,
  func
];

function func(a){
return a*2;
};
var arrayName = [
  func,
  func,
  func
];

for (i = 0; i < arrayName.length; i++) {
  console.log(arrayName[i](2));
}
1 голос
/ 22 июня 2019

Потому что в настоящее время вы храните возвращаемое значение func(param). Сделайте каждый элемент ссылкой на функцию, чтобы иметь возможность вызывать его позже:

var array = [
  () => func(param),
  () => func(param),
  () => func(param)
];

Демо-версия:

function func(p) {
  console.log(p);
}

let param = "Parameter";

var array = [
  () => func(param),
  () => func(param),
  () => func(param)
];

array.forEach(e => e());
1 голос
/ 22 июня 2019

С

var array = [
  func(param),
  func(param),
  func(param)
];

вы уже вызываете эти функции немедленно, когда массив объявлен. Похоже, вы хотите отложить их выполнение - вы хотите, чтобы они были вызваны на в какой-то момент в будущем , а не прямо сейчас. вместо этого создайте массив функций, которые при вызове вызывают функцию с нужными параметрами, например:

var array = [
  () => func(param),
  () => func(param),
  () => func(param)
];

Тогда ваш цикл for (или forEach) будет работать:

for (let i = 0; i < array.length; i++) {
  array[i]();
}

Демо-версия:

const func = console.log;
const param = 'foo';

const array = [
  () => func(param),
  () => func(param),
  () => func(param)
];
array.forEach(fn => fn());

Вы также можете использовать .bind вместо функции более высокого порядка:

const func = console.log;
const param = 'foo';

const array = [
  func.bind(undefined, param),
  func.bind(undefined, param),
  func.bind(undefined, param)
];
array.forEach(fn => fn());
0 голосов
/ 22 июня 2019

Ваш массив заполнен results из function calls, а не functions так, как вы сейчас его настроили.То, что вы хотите, чтобы сохранить функцию (анонимную или нет) и выполнить ее в вашем цикле for.

Вы также можете рассмотреть возможность создания функции, которая будет выполнять каждую из ваших функций и возвращать массив с результатами.,Например, вы можете Array.map через ваш массив, и так как map возвращает массив, вы можете получить для каждой из ваших функций фактический результат.Позволяет вызвать функцию invokeMap (аналогично точно такой же функции , которая есть у lodash):

let add2 = x => x + 2

var fnArray = [  // array of anonymous functions
  (x) => x,  
  (x) => add2(x),
  (x) => add2(x) + add2(x)
];

let invokeMap = (arr, ...parrams) => arr.map((fn => fn(...parrams)))
 
let result = invokeMap(fnArray, 1) // pass one as a parameter to all functions

console.log(result)
...