Как ждать ответа JQUERY AJAX перед выбором условия - PullRequest
8 голосов
/ 03 мая 2011
$("#submit").click(function () {
    var boolError = false;

    CheckForm("#email");
    CheckPhone("#phone");

    if (boolError == true) {
        console.log('error');
    } else {
        console.log('here');
        // $("#form").submit();
    }
});

Проблема в том, что он всегда возвращает console.log('here');

Есть ли способ ждать CheckForm и CheckPhone. Вызов AJAX из функции CheckForm:

$.ajax({
    type: "POST",
    url: "/webservice/user.asmx/CheckForm",
    data: "{'type':'" + var_type + "', 'value':'" + var_value + "'}",
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    error: function (XMLHttpRequest, textStatus, errorThrown) { },
    success: function (data) {
        var obj = data.d;
    }
});

Ответы [ 4 ]

17 голосов
/ 03 мая 2011

Попробуйте установить для async значение false: ( См. Редактирование ниже )

$.ajax({
    type: "POST",
    async: false,
    url: "/webservice/user.asmx/CheckForm",
    data: "{'type':'" + var_type + "', 'value':'" + var_value + "'}",
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    error: function (XMLHttpRequest, textStatus, errorThrown) { },
    success: function (data) {
        var obj = data.d;
    }
});

Это приведет к блокировке вызова AJAX, поэтому браузер будет ждать его завершения, прежде чем продолжить. Конечно, я все еще не уверен, как это относится к булеву проверке в родительском условном выражении. Может быть, есть код, который вы нам не показываете ...

<ч />

Редактировать: ::: sigh ::: Я был молод и глуп, когда отправил этот ответ, и фактически забыл все об этом. Я сохраняю приведенную выше информацию без изменений в исторических целях (поскольку она, похоже, помогла некоторым людям или, по крайней мере, они так думают), но понимаю, что это неправильный подход .

Выполнение асинхронных вызовов синхронно и блокирование выполнения во всех отношениях некорректно. Не делай этого. Вместо этого структурируйте логику, чтобы реагировать на асинхронные операции. В случае этого вопроса вызовы console.log() должны происходить в обработчике успеха (или ошибки) вызова AJAX, а не в коде после вызова этого вызова.

7 голосов
/ 03 мая 2011

Вы должны сделать это в обратном вызове из вызова ajax - как это:

$.ajax({
    type: "POST",
    url: "/webservice/user.asmx/CheckForm",
    data: "{'type':'" + var_type + "', 'value':'" + var_value + "'}",
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    error: function (XMLHttpRequest, textStatus, errorThrown) {
      console.log('error');
    },
    success: function (data) {
      console.log('here');
    }
});

Использование AJAX требует нелинейного программирования - количество обратных вызовов в изобилии.

Вы можете установитьопция в вызове ajax, которая делает его не асинхронным (т. е. jQuery будет ожидать его завершения), но это приведет к тому, что ваше приложение / веб-сайт также не будут работать.

1 голос
/ 03 мая 2011

где вы установили boolError=true ??dats, почему он всегда возвращает здесь ;

вы должны изменить логику следующим образом: checkForm

$.ajax({
    type: "POST",
    error: function (XMLHttpRequest, textStatus, errorThrown) { boolError==true;},
    success: function (data) {
        var obj = data.d;
    }
});
1 голос
/ 03 мая 2011

Да, вы поместили условное в функцию успеха.

 success: function (data) { if (...) { } else { }         

var obj = data.d;
    }
...