我正在尝试使用 fetch 和 ES6 承诺智能地处理来自我们 API 的成功/错误响应。
以下是我需要如何处理响应状态:
204: has no json response, but need to treat as success
406: should redirect to sign in
422: has json for error message
< 400 (but not 204): success, will have json
>= 400 (but not 422): error, will not have json
所以,我正在努力如何干净地写这个。
我现在有一些不太出色的代码工作,如下所示:
fetch()
.then(response => checkStatus(response))
.then(parseJSON) //will throw for the 204
.then(data => notify('success', someMsg))
.catch(error => checkErrorStatus(error))
.then(parseJSON)
.then(data => notify('error', dataForMsg)
.catch(error => notify('error', someGenericErrorMsg)
但是两次使用 catch 似乎很奇怪,我还不知道如何处理那个 204 。
另外,只是为了澄清checkStatus
并checkErrorStatus
做类似的事情:
export function checkStatus(response) {
if (response.status >= 200 && response.status < 300) {
return response
} else {
let error = new Error(response.statusText)
error.response = response
throw error
}
}
function checkErrorStatus(error) {
if(error.response.status === 422) {
return error.response
} else {
let error = new Error(response.statusText)
error.response = response
throw error
}
}
有什么清理这个的建议吗?