Fetch Api。即使response.ok为假,函数也会运行

问题描述 投票:0回答:2

我正在尝试使用 fetch api 从本地网络获取资源

获取后我想检查响应类型并采取相应措施

但是当我收到状态 500 并尝试返回错误回调时,本应仅在

.then()
response.ok
时才运行的
false
函数以任一方式运行

fetch(testUrl, { headers, method: "POST" })
.then(response => {
if (response.status === 200) { return response.json() }
if (response.status === 401) { Logout() }
if (response.status === 500) {
return setTestApiFetchError({
    'error_type': "SERVER_ERROR",
    "error": true
})
}
})
.then(data => console.log(Data))

函数

.then(data => console.log(data))
独立运行

javascript return fetch-api response
2个回答
2
投票

以下是一些可能有帮助的链接: 如何使用 then() 将 Fetch 响应的 JSON 正文传递给 Throw Error()? https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch https://usefulangle.com/post/314/javascript-fetch-error-handling

正如 Ali 提到的,您需要拒绝或抛出 500 响应以将其放入 catch 块中。就我个人而言,我只是检查response.ok,然后处理catch中的任何错误:

fetch(testUrl, { headers, method: "POST" })
.then((response,reject)=> {
 if (response.ok) return response.json();
return Promise.reject(rejectReponse)
})
.then(success)
.catch(fail)

或者,如果您能够使用异步/等待:

try{
    const response = await fetch(testUrl, { headers, method: "POST" });
     if (!response.ok) throw response;
     //response is 200-209
    const data = await response.json();
    //etc.
}catch(e){
    if (e.status === 401) logout();
    //handle server/client errors
}

1
投票

你需要用resolve和reject参数来处理你的promise

像这样尝试一下

const tt =  fetch(testUrl, { headers, method: "POST" })
.then((response,reject)=> {
    const rejectReponse= {
    "error_type": "SERVER_ERROR",
    "error": true
  }
    if (response.ok === true) return response.json() 
        else if (response.status===500) return  reject (rejectReponse)
        })
    
    tt.then(x=>console.log(x)).then(undefined,x=>console.log(x))

要了解本文中的更多检查承诺:https://learnjsx.com/category/2/posts/es6-promise

© www.soinside.com 2019 - 2024. All rights reserved.