我正在使用循环和$ .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);
}
答案 0 :(得分:6)
当您遍历数组时,i
正在递增。由于$ .post是异步的,因此在循环结束后它的成功回调正在激活,因此所有成功回调都是在数组的最后一个索引处使用i
触发的。 $ .each将很容易jquery way
来修复它:
$.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");
答案 1 :(得分:0)
我尝试了Kevin B的$ .each解决方案,但它仍然无法正常工作,所以我最终将$ .post包装在一个函数中,我发布了我的解决方案,因为它可能有助于遇到同样问题的人。< / p>
fillfavorite(0);
function fillfavorite(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);
var g = i+1;
i++;
if(g<arrayOfObjects.length) { fillfavorite(i);}
});
}