2016-05-03 3 views
1

Я тестировал инструмент, который запускает некоторые асинхронные запросы ajax. Ответ одного запроса может прервать другой. Это отлично работает, насколько я тестировал это (Chrome, Firefox), но Edge не любит прерывать! Как только XmlHttpRequest заблокирован, Edge выдает ошибку, чего я не хочу.Сброс триггеров при сбое XmlHttpRequest

Это код (который получает прерван другой фрагмент):

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

Таким образом, результатом является предупреждение произошла ошибка: прервать. Вопрос один: Почему это Edge? Он обрабатывает XHR иначе, чем другие браузеры? Что такое стандарт? Во-вторых, как я могу убедиться, что я не показываю это сообщение? Могу ли я просто сделать что-то подобное в fail(), или не то, что довольно способ идти об этом:

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

ответ

0

кажется, что я нашел то, что происходит.
Это мой код (копируется из вашей):

<!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> 

и мой PHP:

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

Общий ответ: Пограничные кэши XHR GET ответные данные и возвращает немедленно. FF отправляет запрос на сервер. Это имеет значение.
POST Запросы не кэшированы, и xhr.abort() производит ожидаемый результат во всех браузерах.
Допустимо ли это ответ?

Смежные вопросы