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 ответов

12 просмотров

код выполняется в разных потоках. сначала обрабатывается всё, что в корне функции, затем уже только идёт срабатывать 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 возвращает промис

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

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

я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
короче сгенерила мне эта штука код на ассемблере: struc string val { common local .value dq .value .value: if ~val eq db val end if db 0 } fo...
Vi Chapmann Chapmann
12
Всем привет! Массив вводится с клавиатуры, кол-во элементов неизвестно, поэтому я указал arr db 100 dup(?) С нахождением максимума проблем нет, а вот минимум почему-то всегд...
En Vind Av Sorg
11
#include <stdio.h> int main(void) { int n; scanf("%d", &n); int digits1[n] = {0}; int digits2[n] = {0}; я не могу таким образом заранее массив нулями заполнить?
Linus
12
в сях есть множество как в питоне? для удаление дубликатов
Linus
25
я про форму записи. смысл указывать что 8 байтный регистр 8 байт?
Aiwan \ (•◡•) / _bot
10
читать файл максимально быстро? странный вопрос))
zamtmn
53
Вроде бы вопрос уже заезжанный, но тем не менее У меня есть функция menu() которая выводит набор возможных действий, а затем спрашивает у пользователя что он хотел бы сделать....
David Golovatin
2
Кто создает тут ботов для телеграмм групп ?
Antskup
8
а как бы вылезти из ИО, что то типа IO -> Ether или в какую сторону смотреть ? что то туплю
Fedor
14
Карта сайта