Проблема с возвратом значения из AJAX + Promise js [дубликат]

233
04 февраля 2018, 03:05

На данный вопрос уже ответили:

  • Как вернуть значение из события или из функции обратного вызова? Или хотя бы дождаться их окончания 3 ответа

Есть функция которая делает запрос ajax:

let Ajax = function (url, data) {
        $.ajax({
            type: 'POST',
            url: url,
            data: data,
            dataType: 'json',
            success: function(result) {
                let deferred = $.Deferred();
                deferred.resolve(result);
                return deferred.promise();
            },
            complete: function () {},
            error: function (jqXHR) {
            }
        })
    };

Есть условие:

if(new Action().isUser()) {
    ...
} else {
    ....
}

Action:

function Action() {
      ....
        this.isUser = function () {
            return $.when(Ajax(getServer() + 'check', {}).then(function (result) {
                console.log('RESULT');
                return result.isUser;
            }));
        };
      .....
}

Но вот проблема в том что в условие приходит false и код идет дальше, а then срабатывает позже. Что я делаю не так подскажите пожалуйста.

Answer 1

Сейчас вы не возвращаете promise из функции Ajax, он возвращается из success обработчика, так же when здесь не нужен. $.ajax сам возвращает promise, по этому ваш код можно упростить до следующего: https://jsfiddle.net/qpo8rxnv/1/

function Ajax(url, data)
{
    return $.ajax({
        type: 'POST',
        url: url,
        data: { json: JSON.stringify(data) }
  });
};
Ajax('/echo/json/', { data: 5 })
    .done(result=> console.log(result))
    .fail(err=> console.error('ERROR'));

Если делать в том стиле, что делаете вы то код должен выглядеть так:

function Ajax(url, data)
{
    const deferred = $.Deferred();
    $.ajax({
        type: 'POST',
        url: url,
        data: { json: JSON.stringify(data) },
        success: result => deferred.resolve(result)
    })
    return deferred;
};
Ajax('/echo/json/', { data: 5 }).then(r=> console.log(r));
READ ALSO
Отображение меню на телефоне

Отображение меню на телефоне

Как правильно отобразить меню на телефоне с помощью jqueryЧтобы было вот так

246
Не работает .appendChild() в место .innerHTML

Не работает .appendChild() в место .innerHTML

Дамы и Господа, есть такой ajax код:

227
Angular: как прочитать заголовок у ответа?

Angular: как прочитать заголовок у ответа?

Как прочитать заголовок у ответа, к примеруContent-Type? У меня это не получается сделатьЯ пытаюсь хотя-бы отобразить все заголовки

285