我正在使用一个循环和 $.post 来填充我网站上的字段,但是它非常不可靠,它有时有效,有时无效,我不确定问题是什么,如果有人知道问题可能是什么将不胜感激。
for (var i = 0; i < arrayOfObjects.length; i++) {
var object = arrayOfObjects[i];
var option = {};
option['username'] = object.username;
option['COOKIE'] = $.cookie('Favorites');
option['INITIAL'] = 'A';
$.post("/user/favorite.do", option, function (resp) {
var obj = $.parseJSON(resp);
$("#AddFavorite:eq("+i+")").html(obj.txt);
}
当您遍历数组时,i
递增。由于 $.post 是异步的,它的成功回调在循环完成后触发,因此所有成功回调都在数组的最后一个索引处用 i
触发。 $.each 将是一种简单的 jquery 方式
来修复它:
$.each(arrayOfObjects,function(i){
var object = this;
var option = {};
option['username'] = object.username;
option['COOKIE'] = $.cookie('Favorites');
option['INITIAL'] = 'A';
$.post("/user/favorite.do", option, function (resp) {
var obj = $.parseJSON(resp);
$("#AddFavorite:eq("+i+")").html(obj.txt);
});
});
然而,这仍然是一种非常低效的方法。您应该将所有这些请求合并为一个请求。
非 jquery 的替代方案是:
for (var i = 0; i < arrayOfObjects.length; i++) {
(function(i){
var object = arrayOfObjects[i];
var option = {};
option['username'] = object.username;
option['COOKIE'] = $.cookie('Favorites');
option['INITIAL'] = 'A';
$.post("/user/favorite.do", option, function (resp) {
var obj = $.parseJSON(resp);
$("#AddFavorite:eq("+i+")").html(obj.txt);
});
})(i);
}
此外,您的 $.post 可以简化为:
$.post("/user/favorite.do", option, function (resp) {
$("#AddFavorite:eq("+i+")").html(resp.txt);
},"json");