javascript - fetch 即使 404 也解析?

标签 javascript promise fetch-api

使用此代码:

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

此 promise 解决

mdn

It returns a promise that resolves to the Response to that request, whether it is successful or not.

失败的 ajax 请求即使转到不存在的资源也会得到解决,这不是很奇怪吗?

我的意思是 - 下一步是什么?一个 fetch 到一个服务器,但它仍然得到一个解决的 promise ?

我知道我可以在 response 对象的 ok 属性中进行调查,但仍然 -

问题

为什么对于一个完全错误的请求(不存在的资源),提取得到解决。

BTW , jquery request , does get rejected

最佳答案

fetch() 调用仅在网络请求本身由于某种原因(未找到主机、未连接、服务器未响应等)失败时才会被拒绝。

从 promise 的 Angular 来看,从服务器返回的任何结果(404、500 等)都被视为成功的请求。从概念上讲,您从服务器发出请求,服务器响应您,因此从网络的 Angular 来看,请求成功完成。

然后您需要测试成功的响应,看看是否有您想要的答案类型。如果您希望 404 被拒绝,您可以自己编写代码:

fetch('notExists').then(function(response) {
    if (!response.ok) {
        // make the promise be rejected if we didn't get a 2xx response
        throw new Error("Not 2xx response", {cause: response});
    } else {
         // got the desired response
    }
}).catch(function(err) {
    // some error here
});

您甚至可以制作自己的 myFetch(),它会自动为您执行此操作(将任何非 200 响应状态转换为拒绝)。

What is the reason behind a resolved promise for a a completely bad request ( non existing resource / server down).

首先,服务器宕机不会产生成功的响应——那会被拒绝。

如果您成功连接到服务器,向其发送请求并返回响应(任何响应),则会生成成功响应。至于“为什么”fetch() 接口(interface)的设计者决定拒绝基于此,如果不与实际参与该接口(interface)设计的人交谈就很难说,但是这对我来说似乎合乎逻辑。通过这种方式,拒绝告诉您请求是否通过并得到有效响应。由您的代码决定如何处理响应。当然,您可以创建自己的包装函数来修改该默认行为。

关于javascript - fetch 即使 404 也解析?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39297345/

相关文章:

javascript - 不确定如何在包含 Promises 的方法中填充数组

javascript - 使用异步/等待返回值意外获取 API

javascript - 为什么我的 JavaScript 不能打开这个模式框?

javascript - 禁用或至少检测自动分号插入

JavaScript 整数

javascript - 在 Promise 中解决 Promise

javascript - SAPUI5:无法读取 elementBinding 上未定义的属性 'call'

javascript - 顺序调用 Promise

javascript - 使用 Fetch API 读取分块二进制响应

javascript - 是什么导致 Failed to execute 'fetch' on 'ServiceWorkerGlobalScope' : 'only-if-cached' can be set only with 'same-origin' mode error?