Как в 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), но мне же нужно оба условия. Что я делаю не так? |
Эти операции асинхронны. Функция из 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,
я тут в сторону 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() { ? |
Цитата:
Вот только строки 14-21 должны тоже находиться в какой-нибудь async функции. Без этого будет ошибка. Глобальный await без функции пока только предполагают сделать |
Часовой пояс GMT +3, время: 18:12. |