STTRBL
@STTRBL

Как реализовать ajax-запрос внутри функции?

Добрый день! В общем, знаю, что вопрос ужасно надоевший и обсосанный в тысячах ответов, но сижу за проблемой весь день, а ясности в голове существенно не прибавилось. Поэтому вынужден понадоедать вам здесь:

Имеется функция вида:
function getInfo( ) {
let result;
    $.ajax({
        type: "POST",
        url: "handler.php",
        data: {action:'getInfo'},
        success: function(resp) {
            result = resp;
        }
    });
return result;
}


Почему это не будет работать корректно, я понимаю - асинхронность. Но необходимо, чтобы функция все таки возвращала этот несчастный ответ сервера и в своем теле содержала бы код именно +/- в форме *аякс запрос + (возможно) какие то действия с ответом сервера + возврат ответа/результата работы с ответом*. Проблемное здесь - возврат, конечно же. Возможно ли сделать это хоть каким нибудь разумным образом без async:false и перелопачивания подхода к "получению чего то с сервера" во всей структуре кода?

Причина такой потребности в том, что я по своей грандиозной глупости выстроил всю архитектуру кода с расчетом на функции как раз вида "вернутьЗначениеССервера" до того, как сел за аякс (случайный пример ниже).
function foo( ) {
    const x = 5;
    const info = getInfo(); // В теории - получаем что-то юзая аякс. Например, объект
    if (info.something) {    // Сразу же работаем с полученными данными
        x +=5;
    }
    return x;  // Ну, вы понимаете 
}
  • Вопрос задан
  • 438 просмотров
Решения вопроса 1
delphinpro
@delphinpro Куратор тега JavaScript
frontend developer
Придется переписывать.

function getInfo( ) {
  return new Promise((resolve, reject) => {
    $.ajax({
        type: "POST",
        url: "handler.php",
        data: {action:'getInfo'},
        success: function(resp) {
            resolve(resp);
        },
        error: function() {
          reject()
        }
    });
  });
}

getInfo().then(result=> {
  console.log(result);
});
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы