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