【问题标题】:Edge triggers fail when an XmlHttpRequest is aborted中止 XmlHttpRequest 时边缘触发器失败
【发布时间】:2016-08-28 22:44:21
【问题描述】:

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

这是代码(被另一个 sn-p 中止):

  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
}

【问题讨论】:

    标签: ajax xmlhttprequest microsoft-edge jqxhr


    【解决方案1】:

    似乎我发现了发生了什么。
    这是我的代码(抄自你的):

    <!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() 在所有浏览器中都会产生预期的结果。
    这是可以接受的答案吗?

    【讨论】:

      猜你喜欢
      • 2011-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-25
      • 2020-11-08
      • 1970-01-01
      • 2012-12-07
      相关资源
      最近更新 更多