$ .getjson IE特定错误

Ric*_*her 2 javascript ajax jquery internet-explorer getjson

通过使用for循环向服务器询问几个数据库条目,我编写了一段代码,它工作正常,但是:

奇怪的是,这段代码不适用于IE11.对于谷歌浏览器,Firefox,Safari,...,它的工作原理很好.但不幸的是我需要使用IE11.代码没有出错,但是从服务器返回的数据不存在.只是for-loop中的最后一个元素被传输了.

通过使用IE网络连接表示工具,可以看到所有请求都被发回,但不知何故只有最后一个请求已经存在.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);
          }
Run Code Online (Sandbox Code Playgroud)

函数dataReady,应该处理接收的数据,但不知何故使用IE11,只是来自循环的最后一个请求就在那里!因此我决定开一个新的问题.也许有一个天才可以给我一些提示......在此输入图像描述

在此输入图像描述

T.J*_*der 5

IE11与规范不兼容.1不幸的是,letin for循环在IE9-IE11中实现不正确(而Edge直到并包括Edge 13; Edge 14最终使其正确).在与ES2015(又名"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);
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

你有几个选择:

  1. 使用其他解决方案之一来处理循环中的闭包而不是let解决方案.
  2. 使用let,但循环内

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

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


1最初我把它称为"bug",但值得注意的是IE11是在最终的ES2015规范发布前两年发布的,并且letin循环的确切语义在规范过程中移动了,所以它可能就是微软跳过了枪并实施他们认为将基于当前对话的内容,只是在最终规范出来之前改变它.这是在规范过程中过早实施的危险.(在此期间,这个过程本身已经更加正式化,以帮助供应商避免这类事情.)