2016-09-02 83 views
4

使用此代码:即使404也能解析?

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

这个承诺解决

mdn

它返回解析为响应这一要求, 无论是成功与否的承诺。

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

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

我知道我可以在ok财产在response对象进行调查,但仍 -

问题

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

BTW , jquery request , does get rejected

+3

它来解决,所以你可以处理的错误代码。 – Barmar

+0

@Barmar那么为什么不在捕获/拒绝处理程序? –

+0

您是否期望获取标准的作者回复?因为他们会在没有猜测的情况下回答这个问题。 –

回答

7

A 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响应状态转换为拒绝)。

为完全不好的 请求(非现有资源/服务器关闭)解决承诺背后的原因是什么。

首先,服务器关闭不会产生成功的响应 - 将拒绝。

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

+0

噢,我知道没有地方可以比较,但'$ .ajax'到'// a'确实会被拒绝。 http://jsbin.com/pukurolego/1/edit?html,js输出 –

+0

@RoyiNamir - 我不认为你是jsbin的例子正在做你认为的事情。如果我'console.log()'拒绝错误,我看到'无法加载资源:net :: ERR_ADDRESS_UNREACHABLE http:// 0.0.0.22 /'。我不知道jQuery的行为,但你的jsbin没有测试正确的东西。 – jfriend00

+0

你是对的,我的坏,没有看到它。我需要休息 。 –

1

拒绝处理程序是用于网络和CORS错误IIRC。如果请求到达服务器,并且它使用有效的http响应进行响应,则即使响应是代码4xx或5xx,承诺也会得到满足。

0

使用此代码...

fetch(`https://fercarvo.github.io/apps/integradora/DB/corpus.json`) 
.then(async (data) => { 
    if (data.ok) { 
     data = await data.json() 
     //Here you have your data... 
    } 
}).catch(e => console.log('Connection error', e)) 
相关问题