我已经创建了一个for循环,它循环一个元素在容器中出现的次数。for循环从HTML中获取一些数据,并创建一个JSON url,然后返回一个值。然后,应该将该值添加到适当位置的HTML中。
问题似乎是for循环在进行所有Ajax调用之前就完成了,因此只有最后一个值被添加到HTML中。我认为我可以确保readystate等于4,但是这个解决方案没有起作用。我还尝试使用complete,而不是success作为Ajax事件。有什么见解吗?这是我的密码。
for(var index = 0; index < $('#wizSteps #step6 label').length; index++){
var priceCount;
console.log(index);
var currentSelect = $('#wizSteps #step6 label[data-pricepos="'+index+'"]');
url = 'http://www.thesite.com/api/search.json?taxonomy=cat3435' + currentSelect.find('input').attr('name');
jQuery.ajax({
url: url,
dataType: "JSON",
success: function( data ){
var totalResult = data.totalNumberOfResults;
console.log(currentSelect);
currentSelect.find('.itemCount').text(totalResult);
}
});
}
发布于 2014-01-20 10:18:15
看起来,您不一定需要按顺序完成请求,您只需要以一种工作方式跟踪currentSelect
。为此,可以使用context
ajax选项:
for (var index = 0; index < $('#wizSteps #step6 label').length; index++) {
var currentSelect = $('#wizSteps #step6 label[data-pricepos="' + index + '"]');
url = 'http://www.thesite.com/api/search.json?taxonomy=cat3435' + currentSelect.find('input').attr('name');
jQuery.ajax({
url: url,
dataType: "JSON",
context: currentSelect,
success: function (data) {
var totalResult = data.totalNumberOfResults;
this.find('.itemCount').text(totalResult);
}
});
}
发布于 2014-01-20 10:08:59
没关系,打电话是不应该这样做的。它们只在循环中启动。
Ajax是异步的。查询将在稍后完成,可能顺序不同。
如果要确保每个调用在执行下一个调用之前都已完成,则必须将下一个调用集成到前面的回调函数中。
在您的例子中,变量可能被覆盖在回调函数中。您可以在这里了解更多信息:
另一个令人感兴趣的问题/讨论与本专题有关:
它不会直接回答你的问题,但能帮助你更深入地理解问题。关键是您可能根本不需要循环(或者您需要循环,而是以一种完全不同的形式)。
发布于 2014-01-20 10:09:46
您应该尝试创建一个递归函数,在ajax调用成功的情况下再次调用该函数,这样您就可以确保下一个ajax调用只在完成前一个调用之后才被调用。
https://stackoverflow.com/questions/21241133
复制