温馨提示:本文翻译自stackoverflow.com,查看原文请点击:javascript - fetch resolves even if 404?
fetch javascript promise

javascript - 即使404也无法解析?

发布于 2020-03-27 11:58:46

使用此代码:

fetch('notExists') // <---- notice 
    .then(
        function(response)
        {
           alert(response.status)
        }
    )
    .catch(function(err)
    {
       alert('Fetch Error : ', err);
    });

这个承诺解决了

dn

无论成功与否,它都会返回一个承诺,该承诺将解析为对该请求的响应。

即使失败的ajax请求也可以处理到不存在的资源,这也不奇怪吗?

我的意思是-接下来呢?fetch到这来,仍然得到解决承诺的服务器?

我知道我可以调查对象ok属性response,但仍然-

为什么对于完全错误的请求(不存在资源)解决了获取问题。

BTW,jquery请求,确实被拒绝

查看更多

查看更多

提问者
Royi Namir
被浏览
64
jfriend00 2016-09-03 01:26

一个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()界面的设计者决定以拒绝为基础,如果不与实际参与该界面设计的人交谈,很难说出来,但是对我来说似乎是合乎逻辑的。这样,拒绝会告诉您请求是否通过并获得有效的响应。由您的代码决定如何处理响应。当然,您可以创建自己的包装函数来修改该默认行为。