nastya97core
@nastya97core
Начинающий программист

Как в return получить несколько значений?

Здравствуйте. Есть две функции. Одна делает запрос на сервер и возвращает json, а вторая как раз вызывает первую функцию с нужными аргументами. Результат первой (~ajax) функции я хочу обрабатывать во второй, поэтому первая функция должна возвращать просто ответ сервера. Но почему-то в 1-ой функции всё нормально отображается, но когда я делаю return, то вторая функция распознать ничего не может.
// первая (~ajax)
function toCart(e) {
  var req = new XMLHttpRequest();
  ....
  req.onload = function() {
      let res = this.response;
      console.log(res); // {result: ok, count: 3}, а console.log(res.result) вернёт ok
      return res; // {res.result,res.count} - тоже не работает
  }
}
// вторая
function btnClick(e) {
...
  let res = toCart([name, size]);
  console.log(res); // undefined
}

Если же я сделаю в первой функции return res.result, то во второй я его получу (ok), но мне же нужно оба условия.

Что я делаю не так?
  • Вопрос задан
  • 272 просмотра
Решения вопроса 2
nastya97core
@nastya97core Автор вопроса
Начинающий программист
Много ответов. По-сути все правильные, но самый главный ответ в комментах, поэтому я продублирую его сюда.

Действительно, я не получала ответ, так как делала return внутри другой функции. Решение - уход от HttpRequest в сторону fetch и использование async/await
async function toCart(e){
let response = await fetch('tocart.php', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json;charset=utf-8'
  },
  body: JSON.stringify(e)
});

return response.json();
}

async function btnClick(e) {
...
  let res = await toCart([name, size]);
  console.log(res);
}


Отдельное спасибо Mellorn WbICHA и vdem
Ответ написан
Комментировать
@vdem
toCart() судя по всему не возвращает ничего. Результат возвращает анонимная функция, которую Вы присваиваете свойству onload, и он нигде не используется. В btnClick() Вы вызываете функцию toCart(), которая в свою очередь инициирует асинхронный запрос, ответ на который придет в ту анонимную функцию.

UPD: Вот такой вариант будет работать:
function toCart(e, handleResponse) {
    const req = new XMLHttpRequest();
    ...
    req.onload = function() {
        handleResponse(this.response);
    }
}

function btnClick(e) {
    ...
    toCart([name, size], function(response) {
        console.log(response);
    });
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@AUser0
Чем больше знаю, тем лучше понимаю, как мало знаю.
IMHO это из-за асинхронности.
Сначала выполняется первыя функция, она отправляет HTTP-запрос, и заканчивает работу, ничего не возвращая - потому что нечего возвращать.

Вторая функция получает return из первой функции, но он ПУСТОЙ, ага.

И только поооо-о-о-о-о-осле выполнения HTTP-запроса (от долей секунды до многих секунд) происходит вызов функции из res.onload, которой возвращать уже некуда/некому, она ведь вызывается не из второй функции...

Переносите обработку данных из второй функции внутрь res.onload, либо вызывайте обработочную часть второй функции изнутри res.onload.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы