Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как в return получить несколько значений? (https://javascript.ru/forum/misc/82495-kak-v-return-poluchit-neskolko-znachenijj.html)

nastya97core 16.05.2021 18:50

Как в 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), но мне же нужно оба условия.

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

voraa 16.05.2021 19:56

Эти операции асинхронны. Функция из onload вообще не должна возвращать никакого значения. Она выполняется, когда получен ответ от сервера, а функция toCart к этому времени давно завершится. Такие вещи надо делать через Promise/aync-await
Например, так

// первая (~ajax)
function toCart(e) {
  return new Promise ((fresolve) => { // Возвращаем обещание
  var req = new XMLHttpRequest();  
  ....
  req.onload = function() {
      let res = this.response;
      console.log(res); // 
      fresolve ( res); //  Обещение разрешится, когда придет ответ от сервера значением res
  }
   })
}
// вторая
async function btnClick(e) {
...
  let res = await toCart([name, size]); // ждем, когда обещание разрешится, получаем ответ
  console.log(res); 
}

nastya97core 16.05.2021 20:29

voraa,
я тут в сторону fetch пошла. Скажите, всё ли я правильно делаю:
код
async function toCart(e){
let response = await fetch('tocart.php', {
	method: 'POST',
	headers: {
	  'Content-Type': 'application/json;charset=utf-8'
	},
	body: JSON.stringify(e)
});

let result = await response.json();
return result;
}

let btntoCart = qq(".to-cart");
for (let i = 0, count = btntoCart.length; i < count; i++) {
  btntoCart[i].addEventListener("click",async function() {
....
    	let res = await toCart([name, size], "add");
    	console.log(res);
  });
}

ничего страшного, что у меня addEventListener("click",async function() { ?

voraa 16.05.2021 23:56

Цитата:

Сообщение от nastya97core
ничего страшного, что у меня addEventListener("click",async function() { ?

Да. Так можно.

Вот только строки 14-21 должны тоже находиться в какой-нибудь async функции. Без этого будет ошибка.
Глобальный await без функции пока только предполагают сделать


Часовой пояс GMT +3, время: 03:37.