jQuery并行AJAX调用混淆了返回值

jQuery parallel AJAX call mixes up return values

本文关键字:返回值 调用 并行 AJAX jQuery      更新时间:2023-09-26

在下面的JavaScript代码中,我反复对FastCGI模块进行AJAX调用,以查询一些值。在某个时刻,当div2情况的data变量不是0但包含应进入div1的值时,代码终止,而div1显示应进入div2的值。

我使用的是Chromium浏览器(14.0.835.202(Developer Build 103287 Linux)Ubuntu 10.10),但FireFox也会出现这种情况。我还尝试单独使用XMLHttpRequest对象,得到了相同的结果。

这怎么可能,这怎么解决?

function TimerEvent() {
    $.ajax({
        url: "/cgi-bin/wvvar.cgi",
        type: "POST",
        data: "cmd=get&varname=s@SYSDATETIME",
        success: function(data) {
            document.getElementById("div1").innerHTML = data;
        }
    });
    $.ajax({
        url: "/cgi-bin/wvvar.cgi",
        type: "POST",
        data: "cmd=get&varname=@LOGINSTATE",
        success: function(data) {
            document.getElementById("div2").innerHTML = data;
            if (data == "0")
                setTimeout("TimerEvent()", 50);
        }
    });
}

也许试着让它们按顺序排列:

function TimerEvent() {
$.ajax({
    url: "/cgi-bin/wvvar.cgi",
    type: "POST",
    data: "cmd=get&varname=s@SYSDATETIME",
    success: function(data) {
        document.getElementById("div1").innerHTML = data;
        $.ajax({
            url: "/cgi-bin/wvvar.cgi",
            type: "POST",
            data: "cmd=get&varname=@LOGINSTATE",
            success: function(data) {
                document.getElementById("div2").innerHTML = data;
                if (data == "0")
                    setTimeout("TimerEvent()", 50);
            }
        });
    }
});
}

如果您的要求允许,请尝试以下操作:

function TimerEvent() {
$.ajax({
    url: "/cgi-bin/wvvar.cgi",
    type: "POST",
    data: "cmd=get&varname=s@SYSDATETIME",
    success: function(data) {
        document.getElementById("div1").innerHTML = data;
        $.ajax({
            url: "/cgi-bin/wvvar.cgi",
            type: "POST",
            data: "cmd=get&varname=@LOGINSTATE",
            success: function(data) {
                document.getElementById("div2").innerHTML = data;
                if (data == "0")
                    setTimeout("TimerEvent()", 50);
            }
       });
    }
});
}

尝试通过添加async=false选项来同步执行调用。