ajax .done运行不正常,似乎跳过代码

时间:2012-10-18 18:46:30

标签: javascript ajax jquery

我在.each函数中运行了代码。然而,当所有设置完成并且我执行alert(inserted);或警告任何其他变量时,它们会出现0这就是我将它们设置为我声明的时间。我相信他们在范围内。我觉得这与ajax的时间有关,因为如果我在每次通话后发出警报,计数器系统就会起作用。任何想法?此外,我确信正确的if语句被调用,因为我附加了警报(正如我上面所说,当我这样做时,计数器工作)并且它们正常启动并且没有从控制台提出的错误代码。

$.ajax({
    type: "POST",
    url: "/php/filename.php",
    data: {
        one: $('#1').val(),
        two: $('#2').val(),
        three: $('#3').val(),
        four: $('#4').val(),
        five: $('#5').val(),
        six: $('#6').val(),
        seven: $('#classlist').val(),
        id: $('#7').html()
    }
}).done(function(msg) {
    if (msg == "inserted") {
        inserted++;
    }
    else if (msg == "updated") {
        updated++;
    }
    else if (msg == "duplicate") {
        duplicate++;
    }
    else if (msg == "0") {
        fail++;
    }
});

1 个答案:

答案 0 :(得分:4)

Ajax是异步的,您的警报在ajax完成之前发生。将所有ajax返回值存储在一个数组中,将它们全部传递给.when,然后使用它完成以警告变量的值。

var promiseArr = [], inserted = 0;

for (var i = 0; i < 30000; i++) { // <--- unrealistic number of iterations
    promiseArr.push($.ajax({url:"foo.php?id=" + i}).done(function(){
        inserted++;
    }));
}
$.when.apply($,promiseArr).done(function(){
    alert(inserted);
});