0

Всем привет!

пытаюсь получить данные из json файла:

const getData = async () => {
const data = await fetch('db.json');

if (data.ok) { return data.json(); } else { throw new Error(Данные не были получены, ошибка ${data.status} ${data.statusText}); } };

Теперь когда хочу передать или просто увидеть массив через консоль, вот так:

const render = getData();
console.log(render);

То пишет мне :

Promise {<pending>}
 __proto__: Promise
 [[PromiseState]]: "fulfilled"
 [[PromiseResult]]: Array(24)

Как этот массив Array(24) передать в переменную? или обработать фильтром например.

  • Обычно в вашем случае отсылают сюда: https://ru.stackoverflow.com/questions/554290/ Если что-то будет неясно и захотите разобраться в теме асинхронности основательно, стоит прочитать этот раздел: https://learn.javascript.ru/async – vsemozhebuty Jul 14 '21 at 17:25

1 Answers1

1

Дело в том, что async функции всегда возвращают экземпляр Promise.
Поэтому, либо используем await (если вызывающий код сам находится в async функции... или вне функций, если среда выполнения JS позволяет глобальный await):

try {
  const render = await getData();
  console.log(render);
  /* .... */
} catch (err) {
  console.error(err);
}

, либо помещаем обработку результата промиса в коллбэк метода then:

getData().then(render => {
  console.log(render);
  /* .... */
}).catch(err => {
  console.error(err);
});
yar85
  • 10,940
  • при первом варианте выдает ошибку - Uncaught SyntaxError: await is only valid in async functions and the top level bodies of modules. – The king Arthur Jul 14 '21 at 17:30
  • Через then можно будет получить сам массив? – The king Arthur Jul 14 '21 at 17:31
  • @ThekingArthur, если промис возвращаемый функцией getData резовит этот "сам массив" - то да, можно. Результат промиса передается в then аргументом (см. второй отрывок кода в ответе). А ошибка тебе заявляет, что await поддерживается только в async функциях и на верхнем уровне js-модулей (об этом тоже упоминается в начале ответа). – yar85 Jul 14 '21 at 17:33
  • у меня выходит [[PromiseResult]]: undefined – The king Arthur Jul 14 '21 at 17:36
  • Нужно ещё сделать return await data.json(); вроде бы – Алексей Шиманский Jul 14 '21 at 17:37
  • @ThekingArthur, добавь вывод ошибок в коллбэке метода catch (я дописал примеры ответа). – yar85 Jul 14 '21 at 17:38
  • @АлексейШиманский, можно (и иногда нужно), но в данном случае это совсем не обязательно (добавление await в выражение return'а, тут ничего не изменит: функция и так возвращает промис, так почему бы ей не возвращать тот промис который возвращается выражением data.json()...). – yar85 Jul 14 '21 at 17:42