我正在测试一个触发一些异步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
}
答案 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()
会在所有浏览器中产生预期结果
这是可以接受的答案吗?