Является ли законным (или хорошей практикой) цикл с функцией более высокого порядка, например Array.map(), для выполнения некоторых побочных эффектов?
Это в основном теоретический вопрос, так как я заметил, что иногда я находил (или выполнял сам) некоторые циклы, используя метод .map(), например:
let myObject = {...}
let myItemsArray = [ ... , ... ]
myItemsArray.map( (item, index) => {
// do some side effect for ex:
myObject.item[index] = item
}
Но я знаю, что этот метод map() на самом деле возвращает массив. Таким образом, вызов myItemsArray.map() подобен возвращению массива без присвоения его какой-либо переменной.
Так вот вопрос, законно ли это? Должен ли я избегать этого и использовать классический цикл for() или метод .forEach()?
Побочный вопрос: одна из причин, по которой я это задаю, заключается в том, что мне нужно выполнить несколько циклов для асинхронной функции, поэтому задействованы операторы обещаний и ожидания, я помню, что циклы forEach() не идеальны для асинхронной функции, но хотел знать, почему .
вы должны просто использовать forEach, если вы не собираетесь ничего сопоставлять с новым массивом
@jonrsharpe спасибо, действительно, мой код разрешает некоторые промисы, поэтому Promise.All() принимает результат в конце



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Так вот вопрос, законно ли это? Должен ли я избегать этого и использовать классический цикл for() или метод .forEach()?
Если вы ничего не возвращаете из функции карты, вместо этого вы должны использовать forEach. Вы получите тот же результат, но вы не подразумеваете, что кто-либо, поддерживающий ваш код, возвращает что-то полезное.
одна из причин, по которой я спрашиваю об этом, заключается в том, что мне нужно выполнить несколько циклов для асинхронной функции, поэтому задействованы операторы обещаний и ожидания, я помню, что циклы forEach() не идеальны для асинхронной функции, но хотел знать, почему.
Ни forEach, ни map не будут await, если функция, которую вы ей передадите, вернет обещание (что делают async функции).
Таким образом, здесь возможны три сценария:
// Your loop
...myItemsArray...
// Code that comes after the loop
...etc...
A: элементы в цикле должны обрабатываться последовательно
Используйте обычный цикл for (), так как внешняя функция не будет останавливаться.
B: Элементы в цикле могут обрабатываться параллельно, и коду, который следует за ним, не нужно ждать его.
Используйте forEach.
C: Код, который идет после, должен дождаться завершения всего цикла.
Используйте map. Передайте массив возвращенных промисов в Promise.all. Тогда await это.
О, теперь я понял. Итак, forEach() здесь самый «изменчивый» метод, верно? Я не знал, что он работает параллельно. Всегда думайте, что это было похоже на петлю for(). Итак, я предполагаю, что отсутствие возврата forEach() также сохраняет память в чистоте? Где с помощью карты без указания ее на переменную возвращаемый массив может остаться в памяти сеанса?
Если вы не await что-то, все асинхронное в цикле будет выполняться параллельно. С forawait приостановит весь цикл. С forEach он приостановит эту конкретную функцию, но тем временем цикл продолжится с другими данными.
«Я предполагаю, что если ничего не возвращать forEach(), то и память остается чистой?» - Нет.
Строить массив, который вам не нужен, бессмысленно, вместо этого используйте
forEach. Но если вы делаете асинхронные вещи, возможно, вам нужен массив, потому что это то, чтоPromise.allнужно для разрешения всех промисов.