-1

Получаю данные из php

let pars,  lastMonth = [];

$.post('data.php',data => { pars = $.parseJSON(data);

for(let prop in pars) lastMonth.push(pars[prop]); });

Через консоль смотрю

console.log(lastMonth);

Вроде как массив НО если сделать так

console.log(lastMonth[0]);

то undefined.

Что делаю не так?

фото1

[![фото2][2]][2]

введите сюда описание изображения

фото3

1 Answers1

1

Массив это ссылочный тип, выводя его в консоль он при открытии будет иметь актуальные данные, то есть, пока ты выводил пустой массив и нажимал на кнопку раскрыть, он успел его заполнить и отобразить то что в нем находится на момент открытия а не на момент выполнения. Для наглядности выведи массив через JSON.stringify.

А решение собственно это - дождаться выполнения асинхронного кода и потом оперировать полученным значением. Например так

async function doRequest() {
    const months = await new Promise(resolve => {
        $.post('data.php',data => {
            const lastMonth = [];
            pars = $.parseJSON(data);
        for(let prop in pars)
            lastMonth.push(pars[prop]);

        resolve(lastMonth);
    });
});

console.log(months);

}

doRequest();

  • Пробывал так, не работает let lastMonth = []; fetch('data.php') .then(response => response.json()) .then(pars => { for(let prop in pars){lastMonth.push(pars[prop])}; }); console.log(lastMonth[0]); – spoon 100500 Jan 07 '22 at 12:49
  • Ваш код выдаёт ошибку lastMonth is not defined – spoon 100500 Jan 07 '22 at 12:50
  • @spoon100500 в этом вашем пробовании та же самая ошибка что и с jquery — вы выполняете console.log слишком рано и не пытаетесь дождаться момента, когда fetch примет ответ на запрос и заполнит массив – andreymal Jan 07 '22 at 12:51
  • Ваш код выдаёт ошибку lastMonth is not defined? – spoon 100500 Jan 07 '22 at 12:52
  • @spoon100500 обновил ответ – Oleh Pohorilyy Jan 07 '22 at 12:57
  • А разве then() не выполняет ожидание? – spoon 100500 Jan 07 '22 at 13:03
  • 1
    @spoon100500 нет, then просто добавляет функцию-обработчик и мгновенно завершает работу, ничего не ожидая – andreymal Jan 07 '22 at 13:05
  • 1
    then выполнит ожидание текущего промиса, но не текущей строки кода, и передаст значение в лямбду, то есть, запрос запускается параллельно выполнению твоего кода, пока запрос идет, интерпретатор уже переходит к строке console.log, и уже потом учитывая что запрос выполняется дольше, сначала произойдет вывод в консоль а потом запись в lastMonths. – Oleh Pohorilyy Jan 07 '22 at 13:09
  • Спасибо, ох уж эти промисы)) – spoon 100500 Jan 07 '22 at 13:15
  • months находится внутри doRequest() т.е. doRequest() это набор промисов, как присвоить результат переменной? Добавил фото3. – spoon 100500 Jan 07 '22 at 14:27
  • 1
    @spoon100500 снаружи doRequest — никак, в javascript это принципиально невозможно – andreymal Jan 07 '22 at 14:38
  • ...ну или разве что top-level await использовать, если он поддерживается во всех нужных браузерах – andreymal Jan 07 '22 at 14:41