我有以下语法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);
});
}
没有警报就没有填充字段,几乎就像警报强制页面刷新一样。
有什么想法吗?提前谢谢......
答案 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);
}