промисами, достаю объекты, объединяю в массив в переменной. Вывожу переменную в консоль - работает. Пытаюсь перебрать и вывести по одному - не работает. Причем не показывает вообще ничего, ни результата, ни даже какой ошибки. Попробовал вывести 1 элемент по индексу - вообще получил undefined. Как это вообще возможно?
const URL = "https://ipapi.co/json/";
function money(url) {
let arrM = [];
Promise.allSettled([fetch(url), fetch(url)])
.then((res) => res.map((it) => it.value.json())).then(it => it.forEach(i => i.then(d => arrM.push(d))));
console.log(arrM);
arrM.forEach((it) => console.log(it));
}
money(URL);
код выполняется в разных потоках. сначала обрабатывается всё, что в корне функции, затем уже только идёт срабатывать then. перемести вывод в консоль тоже внутрь then
Тогда почему вывод в консоль массива целиком срабатывает? Они же на одном уровне с выводом по одному элементу.
ну как так.. у тебя сейчас в консоль должен выводиться пустой массив
Нифига, выводится полный, в этом и прикол.
https://i.imgur.com/sB3zbQZ.png
ну так ясен хрен, ты его идёшь смотреть уже после того, как он заполнится.
Ну так логично же. Тогда почему я могу посмотреть массив целиком, а не могу посмотреть 1 элемент этого массива?
В консоли обьекты свернуты не случайно
потому что тебе в консоль выплёвывает объект - пустой массив. тебе он отображается как [] затем он заполняется данными. ты его кликаешь и браузер тебе показывает его ОБНОВЛЕННЫЙ вариант. его текущее состояние. он его как бы запоминает у себя в консоли, ссылку на него. а не просто выводит в виде текста. Выводи в виде текста, чтобы не путаться. Через JSON.stringify, как выше порекомендовали.
Понял, спасибо.
а вот, посмотри рядом с [] есть малельнький синий квадратик с буквой i, наведи на него мышкой 😅
Ага, вижу. Обертка не помогла кстати.
обёртка тебе поможет видеть значение на момент вывода. это для наглядности, чтобы ты сейчас понял, что происходит. и там уже будет "[]", в виде строки. а вообще проблему как твою решить - выше писалось. у тебя код в разных потоках работает. массив заполняется в then, вот там его и выводи. либо заюзай async/await
там уже будет "[]", в виде строки. Да нет, там объект в виде строки. Тоже, наверное, с опозданием прилетает просто.
Уже понял - не там оборачивал походу. Обернул на выводе - действительно [] получилось.
примерно как-то так с async/await в этом их смысл, чтобы не возникало проблем, как у тебя const URL = "https://ipapi.co/json/"; async function money(url) { let arrM = []; const x = await Promise.all([(await fetch(url)).json(), (await fetch(url)).json()]); console.log(x); } await money(URL);
Любопытно. Спасибо, попробую.
Поясни плиз еще 1 момент - если убрать первый await, то в результате будет промис, в котором массив с промисами и только в этих промисах уже будет результат. Почему именно так получается, разве не должен быть промис с массивом результатов?
Будет промис с массивом результатов
Я тоже думал что должен, а получается получается не так.
да нет вроде, там результаты, а не промисы
Разве нужны await внутри массива?
нет, это await не на элементы массива, а на fetch, у которых потом уже вызывается json() я не знаю, почему у fetch такая дурацкая архитектура, что json возвращает промис
А зачем там await? fetch вернет промис, но Promise.all и ждет промис же
json вернёт промис тоже. Тогда надо заворачивать в двойной Promise.all
А зачем .json()? Оно вернет респонс. Если там json - будет json
» я не знаю, почему у fetch такая дурацкая архитектура, что json возвращает промис
Обсуждают сегодня