带有ajax请求的jquery循环与包含的警报完美配合,没有警报失败?

时间:2013-04-24 15:20:11

标签: jquery

我有以下语法100%正确工作并填充相应的复选框:

for (var i = 1; i < 30; i++) {     
$.post('get_sku_prices', {data: $('#product'+i).val()},function(result) {
    $('#price'+i).val(result);
    $('#adjustedprice'+i).val(result);
});
alert(i);
}

如上所述正常工作。如果我删除警报并且只是

for (var i = 1; i < 30; i++) {   
$.post('get_sku_prices', {data: $('#product'+i).val()},function(result) {
    $('#price'+i).val(result);
    $('#adjustedprice'+i).val(result);
});

}

没有警报就没有填充字段,几乎就像警报强制页面刷新一样。

有什么想法吗?提前谢谢......

4 个答案:

答案 0 :(得分:2)

那是因为在第一种情况下alert()是阻塞的,需要关闭才能继续循环。

在第二种情况下(没有警报),ajax调用立即执行而不等待响应。即,当第一个请求(i=1)的响应到达时,i不一定是1

您可以使用$.ajax及其context选项修复此问题。

例如:

for (var i = 1; i < 30; i++) {     
    $.ajax({
        type: 'POST',
        url: 'get_sku_prices',
        data: {data: $('#product'+i).val()},
        context: {index: i}, // this value will be available in success as "this"
        success: function(result) {
            $('#price'+this.index).val(result); // use "this.index" here
            $('#adjustedprice'+this.index).val(result);
        }
    });
}

答案 1 :(得分:1)

您可以创建自己的范围函数,类似:

for (var i = 1; i < 30; i++) {
    (function (index) {
        $.post('get_sku_prices', {
            data: $('#product' + index).val()
        }, function (result) {
            $('#price' + index).val(result);
            $('#adjustedprice' + index).val(result);
        });
    })(i)
}

答案 2 :(得分:0)

将Count发送到服务器并尝试对结果进行计数,并根据从结果收到的计数而不是for循环的计数进行更改。

答案 3 :(得分:0)

尝试在函数执行中添加一些延迟

var i=0;
function postRequest(i){
$.post('get_sku_prices', {data: $('#product'+i).val()},function(result) {
    $('#price'+i).val(result);
    $('#adjustedprice'+i).val(result);
});
setTimeout(function(){
    postRequest(i++);
},1000);
}