$.getjson 特定于 IE 的错误

$.getjson IE-specific error

通过使用 for-loop 向服务器请求几个数据库条目,我写了一段代码,效果很好,但是:

神奇的是,这段代码在 IE11 上不起作用。 对于 Google Chrome、Firefox、Safari、...,它工作得很好。但不幸的是我需要使用 IE11。该代码没有给出错误,但从服务器返回的数据不存在。只有 for 循环中的最后一个元素被传输。

通过IE Network connection representation工具,可以看到所有的请求都被发回了,但是不知为何只有最后一个已经在了。 Mabye 有人已经遇到了这个问题,可以给我一些提示...

function getData(setAddress_Event, liter_hour, Fluid_id, dateArray){
          return $.getJSON(setAddress_Event + liter_hour + Fluid_id + "/" + dateArray).then(function(data){
            return {
              data_list:data
            };
          });
        }

       //get day2day data
        var numPendingResults = dateArray.length;
        //new var declaration --> "let" is only valid inside the for loop!!
        for(let j = 0; j<dateArray.length; j++)
        {
        getData(setAddress_Event(), "liter_hour/", Fluid_id, dateArray[j]).then(function(returndata){
          //received data!
          data_collection[j] = returndata;
          numPendingResults--; // one less to wait for!
          if (!numPendingResults) { // we have everything!
            //console.log(data_collection);
            //function call which sends the data forward
            dataReady(data_collection, data_limit);
          }

函数 dataReady 应该处理接收到的数据,但不知何故使用 IE11,只有来自循环的最后一个请求就在那里!因此,我决定提出一个新问题。或许有哪位天才可以给我一些提示...

在 IE11 中与规范不兼容。1 不幸的是,for 循环中的 let 在 IE9-IE11 中错误地实现(和 Edge up到并包括 Edge 13;Edge 14 终于做对了)。在兼容 ES2015(aka "ES6")规范的浏览器中,此代码应显示 1、2、3、4、5;但在 IE11 上,它显示 6、6、6、6、6(就像我们使用 var 时一样)。

for (let i = 1; i <= 5; ++i) {
  setTimeout(function() {
    console.log(i);
  }, 0);
}

您有两个选择:

  1. 使用 dealing with closures in loops 的其他解决方案之一,而不是 let 解决方案。
  2. 使用let,但循环内

这是 #2,它在 IE11 上可以正常工作:

for (let i = 1; i <= 5; ++i) {
  let inner = i; // Different variable
  setTimeout(function() {
    console.log(inner);
  }, 0);
}


1 最初我称它为 "bug," 但值得注意的是 IE11 在最终 ES2015 规范之前两年发布,[= 的确切语义12=] in 循环在规范过程中四处移动,所以可能只是微软跳枪实施了他们认为将基于当前对话的内容,只是在最终规范出来之前改变了它。这是在规范过程中过早实施的危险。 (同时,该过程本身已经更加正式化,以帮助供应商避免这种事情。)