Задать вопрос
@Psihoshit

Как при рекурсивном переборе древовидных объектов вызывать fetch на каждый item и на выходе получать измененный массив?

Есть массив
const data = [
  {
    id: 1122029,
    children: [
      {
        id: 1122028,
        children: [
          {
            id: 1122027,
            children: []
          },
          {
           id: 1122022,
            children: []
          },
          {
            id: 1122022,
            children: []
          },
        ]
      }
    ]
  }
];

Есть функция fetch, которая дергает по id и возвращает некоторые данные.
const fetchOptions (id) => {
  return fetch(`url${id}`).then(result => {
/* тут создаю объект на основе result и возвращаю его*/
    return data
  })
}


Перебираю массив так:
const addingOptions = (array) => {
  array.forEach(item => {
    fetchOptions(item.id);
    
    if (item.children.length) {
      addingOptions(item.children)
    }
  })
}

На выходе хочу получить массив с объектами с доп.полями которые добавляются в функции fetchOptions
И этот массив прокинуть дальше.
Кажется тут нужно использовать Promise, но не могу разобраться как правильно это сделать.
Как дождаться выполнения всех асинхронных запросов и вернуть измененный массив?
  • Вопрос задан
  • 72 просмотра
Подписаться 1 Простой Комментировать
Решения вопроса 2
0xD34F
@0xD34F Куратор тега JavaScript
async function addOptions(arr) {
  const result = [];

  for (const item of arr) {
    result.push({
      ...item,
      options: await fetchOptions(item.id),
      children: await addOptions(item.children),
    });
  }

  return result;
}
Ответ написан
Комментировать
bingo347
@bingo347 Куратор тега JavaScript
Crazy on performance...
const addingOptions = arr => Promise.all(arr.map(
    item => Promise.all([
        fetchOptions(item.id),
        item.children.length ? addingOptions(item.children) : []
    ]).then(([options, children]) => ({
        ...item,
        options,
        children
    }))
));
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы