即使404,fetch也会解析?

时间:2016-09-02 16:51:46

标签: javascript promise fetch

使用此代码:

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

此承诺解析

mdn

  

它返回一个解析为对该请求的响应的promise,    是否成功。

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

我的意思是 - 下一步是什么?一个fetch到服务器,它已经关闭并仍然得到解决的承诺?

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

问题

为什么要为完全错误的请求(非现有资源)解析获取。

BTW , jquery request , does get rejected

4 个答案:

答案 0 :(得分:23)

仅当网络请求本身由于某种原因(未找到主机,没有连接,服务器没有响应等等)失败时,才会拒绝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响应状态转换为拒绝状态)。

  

解决一个完全糟糕的承诺背后的原因是什么?   请求(非现有资源/服务器关闭)。

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

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

答案 1 :(得分:1)

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

答案 2 :(得分: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))

答案 3 :(得分:0)

在@ fernando-caravajal示例的基础上构建(这使得异步/等待使用对我来说更容易),我在下面进行了此稍加修改的版本,用于后查询,并发送了参数。我添加了throw new Error语句,因为我无法抓住response.ok == false上的失败。

/**
 *  Generic fetch function
 */
function fetchData(url,parameters,callback) {

  fetch(url,{
      method: "POST",
      headers: { "Content-Type": "application/json" },
      body: JSON.stringify(parameters),
  })
  .then(async(response) => {
      // status 404 or 500 will set ok to false
      if (response.ok) {
          // Success: convert data received & run callback
          result = await response.json();
          callback(result);
      }
      else {
          throw new Error(response.status + " Failed Fetch ");
      }
  }).catch(e => console.error('EXCEPTION: ', e))
}