即使 404,fetch 也能解决?

IT技术 javascript promise fetch
2021-01-29 02:07:46

使用此代码:

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

这个Promise解决了

域名

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

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

我的意思是——接下来呢?a fetch到已关闭但仍获得已解决Promise的服务器?

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

问题

为什么要为完全错误的请求(不存在的资源)解析获取。

顺便说一句,jquery 请求确实被拒绝了

5个回答

一个fetch()呼叫被拒绝只有当网络请求本身由于某种原因失败(找不到主机,没有连接,服务器没有响应,等...)。

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

然后,您需要测试该成功响应以查看是否具有您想要的答案类型。如果您希望 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")
    } else {
         // go the desired response
    }
}).catch(function(err) {
    // some error here
});

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

对于完全错误的请求(非现有资源/服务器关闭)的已解决Promise背后的原因是什么。

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

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

你说得对,我的错,没看到。我需要休息 。
2021-03-17 02:07:46
@RoyiNamir - 我不认为你是 jsbin 的例子正在做你认为的事情。如果我console.log()拒绝错误,我会看到这个Failed to load resource: net::ERR_ADDRESS_UNREACHABLE http://0.0.0.22/我不知道 jQuery 的确切行为,但是您的 jsbin 没有测试正确的东西。
2021-03-20 02:07:46
哦,好吧,我知道没有地方可以比较,$.ajax只能//a拒绝。jsbin.com/pukurolego/1/edit?html,js,output
2021-04-06 02:07:46

使用此代码...

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))

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

基于@fernando-caravajal 示例(这对我来说使用 async/await 更容易)我在下面做了这个稍微修改的版本,用于发布查询,并发送参数。我添加了该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))
}

正如其他人所说,fetch 仅在出现正确的网络问题时才返回错误。“停机”服务器不会返回 4XX,它不会返回任何内容或 5XX,具体取决于它的“停机”方式。我倾向于使用 axios 而不是 fetch 主要是因为这个问题让我写了更多的代码。