Как в 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, время: 19:25. |