Законно ли использовать метод .map() только для побочных эффектов?

Является ли законным (или хорошей практикой) цикл с функцией более высокого порядка, например 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. Но если вы делаете асинхронные вещи, возможно, вам нужен массив, потому что это то, что Promise.all нужно для разрешения всех промисов.

jonrsharpe 14.12.2020 10:29

вы должны просто использовать forEach, если вы не собираетесь ничего сопоставлять с новым массивом

TKoL 14.12.2020 10:29

@jonrsharpe спасибо, действительно, мой код разрешает некоторые промисы, поэтому Promise.All() принимает результат в конце

Santiago 14.12.2020 10:36
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
4
2 703
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Так вот вопрос, законно ли это? Должен ли я избегать этого и использовать классический цикл 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() также сохраняет память в чистоте? Где с помощью карты без указания ее на переменную возвращаемый массив может остаться в памяти сеанса?

Santiago 14.12.2020 10:42

Если вы не await что-то, все асинхронное в цикле будет выполняться параллельно. С forawait приостановит весь цикл. С forEach он приостановит эту конкретную функцию, но тем временем цикл продолжится с другими данными.

Quentin 14.12.2020 10:43

«Я предполагаю, что если ничего не возвращать forEach(), то и память остается чистой?» - Нет.

Quentin 14.12.2020 10:44

Другие вопросы по теме