2

我正在使用循环和 $.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);

}
4

2 回答 2

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");
于 2012-10-23T20:04:53.043 回答
0

我尝试了 Kevin B 的 $.each 解决方案,但它仍然无法正常工作,所以我最终将 $.post 包装在一个函数中,我发布了我的解决方案,因为它可能对遇到同样问题的人有所帮助。

      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);}


        });


      }
于 2012-10-24T00:02:53.710 回答