console.log() 简单 JSON 调用的不当行为

console.log() misbehaviour with simple JSON calls

我初始化数组 historicalData=[0,0,...,0],然后处理几个 JSON 文件并用结果填充数组。 Console.log-ing 数组内容给出 [0,0,...,0]。 但是,如果我从 firebug 控制台 运行 console.log(historicalData),我会得到正确的内容。为什么?

   var d = new Date();
   var m = d.getMonth();
   var y = d.getYear() +1900;
   var y2 = y-1;
   var historicalData=[0,0,0,0,0,0,0,0,0,0,0,0];    //init step
   var counter = 11;
   var i;

   for (i = m; i!= m || y!=y2; i--) {
    if (i==0) {
     i=12;
     y = y-1;
    }
    var src = "http://192.168.183.135/incidents/affectedUsersJSON.php?month=".concat(i).concat("&year=").concat(y);;
    (function (i,counter,historicalData) {
     $.getJSON(src, function funct(data) {
      count = Object.keys(data).length;
      if (count ==1 ) {
        historicalData[counter] = 0         //filling the array
      }
      else {
       historicalData[counter] = count;     //filling the array
      }
      counter = counter-1;
     })
    }(i,counter,historicalData));
   counter = counter-1;
   }
  </script>
</head>

<body>
<div id="users">Users</div>
  <script type="text/javascript">
    console.log(historicalData);            //console.log-ing the results: I get only ZEROS!
  </script>
</body>
</html>

在对控制台的输出感到失望之后,我从控制台本身 运行 "console.log(historicalData)" 并且..我得到了正确的结果。 为什么?

您遇到了时间问题。当您向网站发出 Ajax 调用以更新变量时,网络浏览器尝试加载该页面时会有一点延迟。因此,在加载页面的前几秒,historicalData 仍将全为 0。由于您在页面加载时立即对数据调用 console.log(),因此 Ajax 调用几乎永远不会及时完成。

您在 $.getJSON 调用中编写的函数在 Web 服务器返回结果之前不会执行。因此,如果您需要对 Ajax 调用的结果执行某些操作,请在该函数内执行,以确保您的数据已经存在。

我相信 JSON 电话还没有完全返回。您需要设置回电

.done(function( data ) {

将您的 console.log 调用结果放在此处,您应该会得到预期的结果。

给你参考

http://api.jquery.com/jquery.getjson/