В приведенном ниже коде я хотел бы изменить поле «изображение» каждого объекта (статьи), хранящегося в массиве «статей». Я знаю, что могу создать пустой массив и отправлять глубокую копию каждой статьи одну за другой, используя оператор распространения, как описано здесь. Есть ли способ изменить содержимое массива «на месте»? Я пробовал передавать статьи в качестве третьего аргумента, но все еще не могу изменить поле «изображение» каждой статьи, хранящейся в массиве. Заранее спасибо.
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));
@MeetZaveri map вполне подходит для сопоставления массива значений с массивом обещаний. Нет ничего плохого в использовании map и Promise.all в приведенном выше фрагменте.
Ваша проблема в том, что then() принимает обратный вызов функция, но вы немедленно вызываете res.status(200).send(articles) (и передаете его результат, undefined, в then). Оберните его в выражение функции.
@Bergi Я решил изменить каждую статью в массиве, затем разрешить каждое обещание с каждой измененной статьей, а затем заключить ответ в функцию, как вы предложили, с «запросами» в качестве аргумента. Технически это не модифицирует статьи на месте, но, по крайней мере, я не создаю вручную массив и не отправляю в него что-то. Спасибо за ответ.
@MeetZaveri Я не понимаю, почему использование карты для синхронного создания массива обещаний, которые затем разрешат / отклонят как часть массива в более позднее время, может вызвать какие-либо несоответствия. Не могли бы вы рассказать о некоторых случаях, когда отображение обещаний в массиве могло вызвать несоответствия? В этой ситуации проблема была не в этом.



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


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