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