当XmlHttpRequest中止时,边缘触发器失败

时间:2016-05-03 18:29:20

标签: ajax xmlhttprequest microsoft-edge jqxhr

我正在测试一个触发一些异步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
}

1 个答案:

答案 0 :(得分: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').'"}';
?>

一般答案:Edge缓存xhr GET响应并立即返回数据。 FF向服务器发送请求。它完全不同。
POST请求未被缓存,xhr.abort()会在所有浏览器中产生预期结果 这是可以接受的答案吗?