2017-02-17 16 views
2

С помощью для цикла попросить сервер для нескольких записей базы данных, я написал кусок кода, который работает хорошо, надлежащее НО:

волшебно этот кусок код не работает на IE11. Для Google Chrome, 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); 
      } 

функция dataReady, должна обрабатывать полученные данные, но как-то с помощью IE11, только последний запрос из цикла есть! Поэтому я решил открыть новый ВОПРОС. Может быть, есть один гений, который может дать мне несколько советов ... enter image description here

enter image description here

+2

* «Волшебно, этот кусок кода не работает на IE» * - Я думаю, что каждый веб-разработчик имеет говорил эти слова хотя бы один раз ... :( –

+0

Macintoshilly :) –

ответ

5

Это несовместимость в IE11 со спецификацией. К сожалению, let в for петлях неправильно реализован в IE9-IE11 (и Edge вплоть до 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); 
 
}

enter image description here

У вас есть несколько вариантов:

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


Первоначально я назвал это «ошибка», но стоит отметить, что IE11 был выпущен за два года до окончательной спецификации ES2015, и точная семантика для циклов let во время процесса спецификации, так что может случиться так, что Microsoft прыгнула с пистолета и реализовала то, что, по их мнению, основываться на текущих разговорах, только чтобы они менялись до выхода финальной спецификации. Это опасность внедрения слишком рано в процессе спецификации.(Этот процесс сам по себе был формализован еще больше, чтобы помочь продавцам избежать такого рода вещей.)