使用JSON在for循环中加载数据

时间:2015-10-08 11:42:41

标签: javascript json for-loop

我有下一个问题给你。我的代码如下:

var data=[];
for(i=0;i<parametrTable.length;++i){
    x = parametrTable[i];
    (function(i) {
        if(i==0){
            $.getJSON("myurlwithparametr", function(json) {
                $.each(json, function(j, d){
                    data.push({"column0": d.column, "count0": d.count});
                 });
             });
         }
         else{
              $.getJSON("myurlwithparametr", function(json) {
                $.each(json, function(j, d){
                    data[j]["count"+i] = d.count});
              });
         }
         })(i);
   }

要提供数据&#39;数组加载从JSON&#39; a收到的个别值。我认为问题在于变量&#39; i&#39;循环,因为负载是异步的。你知道如何避免这种情况吗?

3 个答案:

答案 0 :(得分:1)

这应该做你需要的。

var data=[];
parametrTable.forEach(function (x, i){
    if(i==0) {
        $.getJSON("/url/with/params?params", function(json) {
            $.each(json, function(j, d) {
                data.push({"column0": d.column, "count0": d.count});
             });
         });
     }
     else{
          $.getJSON("myurlwithparametr", function(json) {
            $.each(json, function(j, d){
                data[j]["count"+i] = d.count
            });
        });
    }
});

答案 1 :(得分:1)

这应该注意确保加载和处理第一个JSON,然后处理所有其他JSON(按任意顺序)

var data = [];
x = parametrTable[0];
$.getJSON("myurlwithparametr", function(json) { ... get first data
    $.each(json, function(j, d) { // ... process first data
        data.push({
            "column0": d.column,
            "count0": d.count
        });
    });
    $.each(parametrTable, function(i, x) { // NOTE: x is now populated here
        if (i) { // run from 1 ... end after 1st JSON is done
            $.getJSON("myurlwithparametr", function(json) {
                $.each(json, function(j, d) {
                    data[j]["count" + i] = d.count;
                });
            });
        }
    });
});

更好/更清洁的替代方案

var data = [];
$.each(parametrTable, function(i, x) { // NOTE: x = parametrTable[i]
    $.getJSON("myurlwithparametr", function(json) {
        $.each(json, function(j, d) {
            data[j] = data[j] || {};
            data[j]["count" + i] = d.count;
            if (i == 0) {
                data[j].column0 = d.column;
            }
        });
    });
});

答案 2 :(得分:0)

这应该按顺序进行调用,也就是说,除非前一个调用完成,否则下一个调用将不会启动。您可能仍需要检查其他代码中的呼叫何时完成

var data=[];
getDataParametr(data, parametrTable, 0); 
function getDataParametr(data, parametrTable, i){
  x = parametrTable[i];
  var url="myurlwithparametr";
  $.getJSON(url, function(json) {
    if(i==0){  
      $.each(json, function(j, d){data.push({"column0": d.column, "count0": d.count});});
    } else {
      $.each(json, function(j, d){data[j]["count"+i] = d.count});
    }
    if(++i<parametrTable.length){
      getDataParametr(data, parametrTable, i);
    }
  });
}