Javascript 使用状态为500的FetchAPI读取json内容的更好方法

Javascript 使用状态为500的FetchAPI读取json内容的更好方法,javascript,promise,fetch,Javascript,Promise,Fetch,处理错误处理问题,需要根据返回的状态代码捕获错误。此外,我需要获取响应的主体以获取特定的错误消息。我创建了一个大致的脚本,如下所示: let status = 200; return fetch('/someurl',{ credentials: 'include' }) .then(res => { if(!res.ok) { status = res.status; }

处理错误处理问题,需要根据返回的状态代码捕获错误。此外,我需要获取响应的主体以获取特定的错误消息。我创建了一个大致的脚本,如下所示:

let status = 200;
return fetch('/someurl',{ credentials: 'include' })
        .then(res => {
             if(!res.ok) {
                 status = res.status;
             }
             return res.json();
         })
        .then(json => {
            if(status < 200 || status >= 300) {
                notifyError(status, json);
            }
            treatResponse(json);
        })
        .catch(err => notifyError(err));
let status=200;
返回fetch('/someurl',{credentials:'include'})
。然后(res=>{
如果(!res.ok){
状态=恢复状态;
}
返回res.json();
})
。然后(json=>{
如果(状态<200 | |状态>=300){
notifyError(状态,json);
}
treatResponse(json);
})
.catch(err=>notifyError(err));
这段代码按照我的预期工作,但在代码质量方面,它不是我所期望的,因为我使用了一个全局变量来通知下一个,然后通知上一个,然后发生了什么。。。非常难看

我认为我的代码反映了这样一个事实,即我不熟悉fetchapi和这个promise之类的东西,我理解但不熟悉

有人能提出更好的建议吗


谢谢

您可以使用以下方法将承诺传递给一系列承诺,从而将其转换为:

返回fetch('/someurl',{credentials:'include'})
.then(res=>Promise.all([res.status,res.json()]))
。然后(([状态,json])=>{
如果(状态<200 | |状态>=300){
notifyError(状态,json)
}
treatResponse(json)
})
.catch(err=>notifyError(err))

只需抛出错误并在
catch
块上捕获该错误-

return fetch('/someurl',{ credentials: 'include' })
        .then(res => {
             if(!res.ok) {
                 throw Error('something');
             }
             return res.json();
         })
        .then(json => {
            if(status < 200 || status >= 300) {
                throw Error('something othere');
            }
            treatResponse(json);
        })
        .catch(err => notifyError(err));
返回fetch('/someurl',{credentials:'include'})
。然后(res=>{
如果(!res.ok){
抛出错误(“某物”);
}
返回res.json();
})
。然后(json=>{
如果(状态<200 | |状态>=300){
抛出错误(“其他事物”);
}
treatResponse(json);
})
.catch(err=>notifyError(err));

也许这有帮助-

这是一个巧妙的技巧,我认为你应该添加
返回treatResponse(json)
,因为如果它返回了一些东西,这个结果将不会被使用。@alexmac告诉OP,而不是我。我只是在复制给定的代码,并要求改进。如果您在操作代码中看到一个错误,您至少应该提到这一点,并且可能建议可能的解决方案来修复它。@alexmac问题是,这不是一个错误。有时承诺仅用于确定某件事情何时完成,不一定要等待某个值。这也很简单。这不会复制所需的代码,
notifyError()
不会传递
状态
,当错误为500响应时,
json
是异步函数吗?除了这个
notifyError
看起来很奇怪之外,它还接受
status
json
或error。。。最好只接受错误,但可能有
status
json
字段。@alexmac我同意你关于
notifyError()
的奇怪签名,但要回答你的问题,是的,
res.json()
返回一个承诺。
return fetch('/someurl',{ credentials: 'include' })
        .then(res => {
             if(!res.ok) {
                 throw Error('something');
             }
             return res.json();
         })
        .then(json => {
            if(status < 200 || status >= 300) {
                throw Error('something othere');
            }
            treatResponse(json);
        })
        .catch(err => notifyError(err));