使用此代码:
fetch('notExists') // <---- notice
.then(
function(response)
{
alert(response.status)
}
)
.catch(function(err)
{
alert('Fetch Error : ', err);
});
这个承诺解决了。
无论成功与否,它都会返回一个承诺,该承诺将解析为对该请求的响应。
即使失败的ajax请求也可以处理到不存在的资源,这也不奇怪吗?
我的意思是-接下来呢?一 fetch
到这来,仍然得到解决承诺的服务器?
我知道我可以调查对象的ok
属性response
,但仍然-
题
为什么对于完全错误的请求(不存在资源)解决了获取问题。
一个fetch()
呼叫被拒绝只有当网络请求本身由于某种原因失败(找不到主机,没有连接,服务器没有响应,等...)。
从承诺的角度来看,从服务器返回的任何结果(404、500等)都被视为成功请求。从概念上讲,您从服务器发出了一个请求,服务器回答了您,因此从网络的角度来看,该请求已成功完成。
然后,您需要测试该成功响应,以查看是否具有所需的答案类型。如果您想拒绝404,可以自己编写代码:
fetch('notExists').then(function(response) {
if (response.status !== 200) {
// make the promise be rejected if we didn't get a 200 response
throw new Error("Not 200 response")
} else {
// go the desired response
}
}).catch(function(err) {
// some error here
});
您甚至可以自己创建myFetch()
一个为您自动执行的操作(将所有非200响应状态转换为拒绝)。
解决完全不正确的请求(不存在现有资源/服务器停机)的承诺背后的原因是什么?
首先,服务器停机将不会生成成功的响应-这将被拒绝。
如果成功连接到服务器,向服务器发送请求,然后返回响应(任何响应),则生成成功响应。至于“为什么” fetch()
界面的设计者决定以拒绝为基础,如果不与实际参与该界面设计的人交谈,很难说出来,但是对我来说似乎是合乎逻辑的。这样,拒绝会告诉您请求是否通过并获得有效的响应。由您的代码决定如何处理响应。当然,您可以创建自己的包装函数来修改该默认行为。
哦,我知道有没有地方来比较,但
$.ajax
以//a
不拒绝。jsbin.com/pukurolego/1/edit?html,js,输出@RoyiNamir-我不认为您是jsbin的例子,正在做您认为的事情。如果我
console.log()
拒绝错误,我会看到这个Failed to load resource: net::ERR_ADDRESS_UNREACHABLE http://0.0.0.22/
。我不完全知道jQuery的行为,但是您的jsbin并未测试正确的东西。您说得对,我的天哪,没看到。我需要休息 。