@levantez

Ajax внутри функции, как вернуть результат запроса?

Собственно авторизация на JS , есть общая функция запроса и проверка авторизации
function getAjax(url,data,callback) {
    var patch = 'http://server.ser/mobile_app/';
    $.ajax({
        url:patch + url,
        type:'POST',
        dataType:'json',
        data:data,
        success:callback,
        error: function(jqXHR, textStatus, errorThrown) {
            console.log('Ошибка: ' + textStatus + ' | ' + errorThrown);
        }
    });
}

function try_login (login,pass) {
    var ret = false;
    getAjax('try_login.php',{login:login,pass:pass},function(data){
        if (typeof data.success != 'undefined' && data.success == 'ok') {
            ret = true;
            console.log('try login true');
            ret = true;
        }
    });
    return ret;
}


Естественно try_login возвращает false, т.к. асинхронность, но async:false мне не подходит, т.к. функция будет выполняться постоянно. В теории понимаю как делать в моем случае правильно, это что-то вроде :
//хотел так
    if (try_login('login','pass')) {
        alert('Ура');
    }

    // а придется как-то так
    getAjax('try_login.php',{login:'login',pass:'pass'},function(data){
        if (typeof data.success != 'undefined' && data.success == 'ok') {
            alert('Не очень ура');
        }
    });


Первый вариант просто более минималистичен и глазу красив, может быть кто-то знает способ не уходить от него???
  • Вопрос задан
  • 684 просмотра
Пригласить эксперта
Ответы на вопрос 2
Ответ написан
Комментировать
@Faliah
Один из вариантов - использовать deferred, который есть из коробки:
function getEndpoint(method, url) {
  var apiBaseUrl = 'http://server.ser/mobile_app/'
  
  return function(data) {	
    
    return $.ajax({
      url: apiBaseUrl + url,
      type: method,
      dataType: 'json',
      data: data
    })
  }
}

var tryLogin = getEndpoint('POST', '/post');

tryLogin({ user: 'Foo', pass: 'bar' })
  .done(function(data) { 
    if (typeof data.success != 'undefined' && data.success == 'ok') {
      console.log('try login true');    
    }
  })
  .fail(function(jqXHR, textStatus, errorThrown) {
    console.log('Ошибка: ' + textStatus + ' | ' + errorThrown);
  });
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы