Изменение массива внутри карты / обещания (Javascript)

В приведенном ниже коде я хотел бы изменить поле «изображение» каждого объекта (статьи), хранящегося в массиве «статей». Я знаю, что могу создать пустой массив и отправлять глубокую копию каждой статьи одну за другой, используя оператор распространения, как описано здесь. Есть ли способ изменить содержимое массива «на месте»? Я пробовал передавать статьи в качестве третьего аргумента, но все еще не могу изменить поле «изображение» каждой статьи, хранящейся в массиве. Заранее спасибо.

let requests = articles.map((article, i)=>{
     return new Promise((resolve) => {
          articleImage.findById(article.image, (err, theImage)=>{
               if (err) return res.status(400).send(err);
               articles[i].image = theImage.source;
               resolve();
          });
     });
});
Promise.all(requests).then(res.status(200).send(articles));

Прежде всего, карта синхронизируется, а обещание - асинхронно! Их нельзя сочетать вместе. Ваши данные обрабатываются после выполнения обещания. Таким образом, вы не можете выполнять асинхронные операции в синхронных циклах, то есть for, forEach, map и т. д.

Meet Zaveri 25.08.2018 10:21

@MeetZaveri map вполне подходит для сопоставления массива значений с массивом обещаний. Нет ничего плохого в использовании map и Promise.all в приведенном выше фрагменте.

Bergi 25.08.2018 14:55

Ваша проблема в том, что then() принимает обратный вызов функция, но вы немедленно вызываете res.status(200).send(articles) (и передаете его результат, undefined, в then). Оберните его в выражение функции.

Bergi 25.08.2018 14:56

@Bergi Я решил изменить каждую статью в массиве, затем разрешить каждое обещание с каждой измененной статьей, а затем заключить ответ в функцию, как вы предложили, с «запросами» в качестве аргумента. Технически это не модифицирует статьи на месте, но, по крайней мере, я не создаю вручную массив и не отправляю в него что-то. Спасибо за ответ.

topstarterrhp 26.08.2018 01:54

@MeetZaveri Я не понимаю, почему использование карты для синхронного создания массива обещаний, которые затем разрешат / отклонят как часть массива в более позднее время, может вызвать какие-либо несоответствия. Не могли бы вы рассказать о некоторых случаях, когда отображение обещаний в массиве могло вызвать несоответствия? В этой ситуации проблема была не в этом.

topstarterrhp 26.08.2018 01:59
Поведение ключевого слова "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) для оценки ваших знаний,...
0
5
274
0

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