XmlHttpRequest 中止时边缘触发器失败

Edge triggers fail when an XmlHttpRequest is aborted

我正在测试一个可以触发一些异步 ajax 请求的工具。一个请求的响应可以中止另一个请求。就我测试过的(Chrome,Firefox)而言,这非常有效,但 Edge 不喜欢中止!一旦 XmlHttpRequest 被阻止,Edge 就会抛出一个失败 - 我不希望发生这种情况。

这是代码(被另一个片段中止):

  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
}

我好像发现了什么情况
这是我的代码(从你的复制而来):

<!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').'"}';
?>

一般答案:Edge 立即缓存 xhr GET 响应和 returns 数据。 FF 向服务器发送请求。这一切都不同。
POST 请求未被缓存并且 xhr.abort() 在所有浏览器中产生预期结果。
答案是否可以接受?