2017-02-17 5 views
2

Durch die Verwendung einer for-Schleife den Server für mehrere Datenbankeinträge zu fragen, ich ein Stück Code geschrieben hat, die richtigen gut funktioniert, ABER:

Magisch dieses Stück Code funktioniert nicht auf dem IE11. Für Google Chrome, Firefox, Safari, ... funktioniert es gut. Aber leider muss ich IE11 verwenden. Der Code gibt keinen Fehler, aber die vom Server zurückgegebenen Daten sind nicht vorhanden. Nur das letzte Element in der For - Schleife wurde übertragen.

Mit dem IE Network Connection Representation Tool kann man sehen, dass alle Anfragen zurückgeschickt wurden, aber irgendwie ist nur die letzte schon da. Mabye schon jemand dieses Problem gehabt und kann einige Hinweise geben mir ...

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

die Funktion Dataready, sollten die empfangenen Daten verarbeiten, aber irgendwie IE11 verwenden, nur die letzte Anforderung von der Schleife ist da! Deshalb habe ich beschlossen, eine neue Frage zu stellen. Vielleicht gibt es ein Genie, das mir einige Hinweise geben kann ... enter image description here

enter image description here

+2

* "Magisch, dieses Stück Code funktioniert nicht auf IE" * - Ich denke, jeder Webentwickler hat habe diese Worte mindestens einmal gesprochen ... :( –

+0

Macintoshilly :) –

Antwort

5

Es ist eine Inkompatibilität in IE11 mit der Spezifikation. Leider ist let in for Schleifen in IE9-IE11 (und Edge bis einschließlich Edge 13; Edge 14 schließlich richtig) implementiert. In einem Browser, der mit der ES2015-Spezifikation ("ES6") kompatibel ist, sollte dieser Code 1, 2, 3, 4, 5; aber auf IE11 zeigt es stattdessen 6, 6, 6, 6, 6 (wie wenn wir var verwenden würden).

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

enter image description here

Sie haben ein paar Optionen:

  1. Verwenden Sie eine der anderen Lösungen für dealing with closures in loops anstelle der let Lösung.
  2. Verwenden let, aber innerhalb die Schleife

Hier ist # 2, die korrekt auf IE11 funktioniert:

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


Ursprünglich rief ich es ist ein "Käfer", aber Es ist erwähnenswert, dass IE11 zwei Jahre vor der endgültigen ES2015-Spezifikation veröffentlicht wurde, und die genaue Semantik für let in Schleifen während des Spezifikationsprozesses verschoben wurde, so könnte es einfach sein, dass Microsoft sprang die Waffe und implementiert, was sie dachten, es würde basierend auf aktuellen Konversationen, nur um sie zu ändern, bevor die endgültige Spezifikation herauskam. Es ist die Gefahr, zu früh im Spezifikationsprozess zu implementieren.(Dieser Prozess wurde in der Zwischenzeit mehr formalisiert, um Anbietern zu helfen, solche Dinge zu vermeiden.)