Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 16.05.2021, 18:50
Аватар для nastya97core
Аспирант
Отправить личное сообщение для nastya97core Посмотреть профиль Найти все сообщения от nastya97core
 
Регистрация: 04.04.2020
Сообщений: 60

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

Что я делаю не так?
Ответить с цитированием
  #2 (permalink)  
Старый 16.05.2021, 19:56
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,692

Эти операции асинхронны. Функция из 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); 
}

Последний раз редактировалось voraa, 16.05.2021 в 20:00.
Ответить с цитированием
  #3 (permalink)  
Старый 16.05.2021, 20:29
Аватар для nastya97core
Аспирант
Отправить личное сообщение для nastya97core Посмотреть профиль Найти все сообщения от nastya97core
 
Регистрация: 04.04.2020
Сообщений: 60

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() { ?

Последний раз редактировалось nastya97core, 16.05.2021 в 20:33.
Ответить с цитированием
  #4 (permalink)  
Старый 16.05.2021, 23:56
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,692

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

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

Последний раз редактировалось voraa, 17.05.2021 в 00:01.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как получить результат от ajax запроса (из отдельного файла) 1Feniks1 AJAX и COMET 0 12.03.2017 18:45
Как правильно получить и присвоить данные полученные из сервера Axios, react-redux hambat Общие вопросы Javascript 5 07.03.2017 17:09
Как получить несколько элементов с одинаковым id? Poveritov Элементы интерфейса 1 18.04.2016 10:58
Вернуть return через несколько функций TheMilkMan Общие вопросы Javascript 4 25.06.2013 17:22
:contains Как указать несколько значений? Mafa jQuery 6 17.08.2011 15:58