如何在选择条件之前等待JQUERY AJAX响应

时间:2011-05-03 10:21:53

标签: jquery ajax return

$("#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。来自CheckForm函数的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) { },
    success: function (data) {
        var obj = data.d;
    }
});

4 个答案:

答案 0 :(得分:16)

尝试将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调用阻塞,以便浏览器在继续之前等待它完成。当然,我仍然不确定这与在父条件中检查的布尔值有何关系。也许你没有向我们展示代码......


编辑: :::叹气:::当我发布这个答案时,我年轻而愚蠢,实际上已经忘记了所有这些。我保留上述信息不会出于历史目的(因为它似乎帮助了一些人,或者至少他们认为它有),但是要明白这是 不正确的方法 < /强>

使异步调用同步并阻止执行在各方面都是不正确的。不要这样做。相反,构造逻辑以响应异步操作。对于这个问题,调用console.log()应该发生在AJAX调用的成功(或错误)处理程序中,而不是在调用该调用后的代码中。

答案 1 :(得分:7)

你必须在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将等待它完成),但这会使您的应用程序/网站无法正常运行。

答案 2 :(得分:1)

是的,你把条件置于成功函数之内。

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

var obj = data.d;
    }

答案 3 :(得分:1)

你设置boolError=true ?? dats为什么总是返回这里;

你必须在 checkForm

中改变这样的逻辑
$.ajax({
    type: "POST",
    error: function (XMLHttpRequest, textStatus, errorThrown) { boolError==true;},
    success: function (data) {
        var obj = data.d;
    }
});