2016-05-03 12 views
1

Ich habe ein Tool getestet, das einige asynchrone Ajax-Anforderungen auslöst. Die Antwort einer Anfrage kann eine andere abbrechen. Das funktioniert großartig, soweit ich das getestet habe (Chrome, Firefox), aber Edge möchte nicht abbrechen! Sobald die XmlHttpRequest blockiert ist, löst Edge einen Fehler aus - was ich nicht möchte.Edge-Trigger schlagen fehl, wenn ein XmlHttpRequest abgebrochen wird

Dies ist der Code (das von einem anderen Schnipsel abgebrochen wird):

xhr = $.ajax("my-url.php") 
    .done(function(json) { 
     var data = $.parseJSON(json); 
     if (data.data) { 
      // Yay data! 
     } else { 
      // Ahw no data or empty data 
     } 
    }) 
    .fail(function(jqXHR, textStatus, error) { 
     // This is triggered by Edge, `error` is "abort" 
     var string = "An error occurred: " + error + "."; 
     alert(string); 
    }) 
    .always(function() { 
     done = true; 
    }); 

Also, ist das Ergebnis ein Alarm ist ein Fehler aufgetreten: abbrechen. Frage eins: Warum ist Edge das tun? Behandelt XHR anders als andere Browser? Was ist der Standard? Zweitens, wie stelle ich sicher, dass ich diese Nachricht nicht zeige? Kann ich einfach in fail() etwas tun, oder ist das nicht ein ziemlich Weg, um darüber zu gehen:

if (error != 'abort') { 
    // Do stuff, only when error isn't abort 
} 

Antwort

0

Es scheint, dass ich gefunden, was passiert.
Dies ist mein Code (von Ihnen kopiert):

<!DOCTYPE html> 
<html> 
<head> 
    <title></title> 
    <meta charset="utf-8" /> 
    <script src="https://ajax.aspnetcdn.com/ajax/jquery/jquery-2.1.4.min.js" type="text/javascript"></script> 
    <script type="text/javascript"> 
     'use strict'; 
     var xhr, done; 
     function getResp() { 
      if (!done && xhr && xhr.readyState !== 4) 
       xhr.abort(); 
      done = false; 
      xhr = $.ajax("json.php",{method:'GET'}) 
// you didn't include method so method is 'GET' 
// when I change it to 'POST' Edge honors xhr.abort() 
       .done(function (json) { 
        console.log(json); 
        var data = $.parseJSON(json); 
        if (data.data) { 
         // Yay data! 
        } else { 
         // Ahw no data or empty data 
        } 
       }) 
       .fail(function (jqXHR, textStatus, error) { 
        // This is triggered by Edge, `error` is "abort" 
        var string = "An error occurred: " + error + "."; 
        //alert(string); 
        console.log(string); 
       }) 
       .always(function() { 
        done = true; 
       }); 
     } 
    </script> 
</head> 
<body> 
<input type="button" onclick="getResp()" value="run" /> 
</body> 
</html> 

und meine php:

<?php 
usleep(10000000); //10 seconds 
echo '{"name":"test","qty":10,"curr":"'.date('h:i:s').'"}'; 
?> 

Allgemeine Antwort: Edge-Caches XHR GET Antwort und kehrt sofort Daten. FF sendet eine Anfrage an den Server. Es macht den Unterschied.
POST Anforderungen werden nicht zwischengespeichert und xhr.abort() erzeugt erwartetes Ergebnis in allen Browsern.
Ist es eine akzeptable Antwort?

Verwandte Themen