169 похожих чатов

Господа, кто сталкивался с подобным мистическим явлением? Получаю массив с

промисами, достаю объекты, объединяю в массив в переменной. Вывожу переменную в консоль - работает. Пытаюсь перебрать и вывести по одному - не работает. Причем не показывает вообще ничего, ни результата, ни даже какой ошибки. Попробовал вывести 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);

30 ответов

28 просмотров

код выполняется в разных потоках. сначала обрабатывается всё, что в корне функции, затем уже только идёт срабатывать then. перемести вывод в консоль тоже внутрь then

Макс-Ворон Автор вопроса
Рой Волков
код выполняется в разных потоках. сначала обрабаты...

Тогда почему вывод в консоль массива целиком срабатывает? Они же на одном уровне с выводом по одному элементу.

Макс Ворон
Тогда почему вывод в консоль массива целиком сраба...

ну как так.. у тебя сейчас в консоль должен выводиться пустой массив

Макс-Ворон Автор вопроса
Рой Волков
ну как так.. у тебя сейчас в консоль должен выводи...

Нифига, выводится полный, в этом и прикол.

Макс-Ворон Автор вопроса

https://i.imgur.com/sB3zbQZ.png

Макс Ворон
https://i.imgur.com/sB3zbQZ.png

ну так ясен хрен, ты его идёшь смотреть уже после того, как он заполнится.

Макс-Ворон Автор вопроса
Рой Волков
ну так ясен хрен, ты его идёшь смотреть уже после ...

Ну так логично же. Тогда почему я могу посмотреть массив целиком, а не могу посмотреть 1 элемент этого массива?

Макс Ворон
Ну так логично же. Тогда почему я могу посмотреть ...

потому что тебе в консоль выплёвывает объект - пустой массив. тебе он отображается как [] затем он заполняется данными. ты его кликаешь и браузер тебе показывает его ОБНОВЛЕННЫЙ вариант. его текущее состояние. он его как бы запоминает у себя в консоли, ссылку на него. а не просто выводит в виде текста. Выводи в виде текста, чтобы не путаться. Через JSON.stringify, как выше порекомендовали.

Макс Ворон
https://i.imgur.com/sB3zbQZ.png

а вот, посмотри рядом с [] есть малельнький синий квадратик с буквой 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);

Макс-Ворон Автор вопроса
Макс-Ворон Автор вопроса
Рой Волков
примерно как-то так с async/await в этом их смысл,...

Поясни плиз еще 1 момент - если убрать первый await, то в результате будет промис, в котором массив с промисами и только в этих промисах уже будет результат. Почему именно так получается, разве не должен быть промис с массивом результатов?

Макс-Ворон Автор вопроса
Denys Mikhalenko
Будет промис с массивом результатов

Я тоже думал что должен, а получается получается не так.

Daria Shuleko
Разве нужны await внутри массива?

нет, это await не на элементы массива, а на fetch, у которых потом уже вызывается json() я не знаю, почему у fetch такая дурацкая архитектура, что json возвращает промис

Рой Волков
нет, это await не на элементы массива, а на fetch,...

А зачем там await? fetch вернет промис, но Promise.all и ждет промис же

Denys Mikhalenko
А зачем там await? fetch вернет промис, но Promise...

json вернёт промис тоже. Тогда надо заворачивать в двойной Promise.all

Рой Волков
нет, это await не на элементы массива, а на fetch,...

А зачем .json()? Оно вернет респонс. Если там json - будет json

Daria Shuleko
А зачем .json()? Оно вернет респонс. Если там json...

» я не знаю, почему у fetch такая дурацкая архитектура, что json возвращает промис

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

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта