我有一个代码:
function () {
return new Promise((resolve, reject) => {
try {
fetch(URL, { method: METHOD, body: BODY })
.then((res) => res.json())
.then((json) => {
resolve(json);
})
.catch((res) => {
reject(res);
})
} catch (exception) {
reject(exception);
}
});
}
当服务器响应不使用 json 时,我有
未处理的承诺拒绝警告:未处理的承诺拒绝。此错误起源于在没有 catch 块的异步函数内部抛出,或者拒绝未使用 .catch(( 处理的承诺。
我知道尝试捕获不会捕获异步抛出。
我读过
无法在承诺中捕获未处理的承诺拒绝警告,
尝试捕获无法捕获未处理的承诺拒绝警告,
"未处理的承诺拒绝警告"错误,即使存在捕获
但我的问题没有答案。
>Try catch
将无法处理异步抛出的错误(即承诺(,您必须为此使用.catch()
。
JSfiddle
function someFunc() {
return new Promise((resolve, reject) => {
fetch(URL, {method: METHOD, body: BODY})
.then((res) => res.json())
.then((json) => {
resolve(json);
})
.catch((err) => {
reject(err);
})
});
}
someFunc()
.then((value)=>{})
.catch((err)=>{console.log(err)})
编辑: 当服务器响应时没有json
但有错误,则返回的承诺是rejected
。因此,您应该确保在函数调用(即someFunc().catch(()=>{})
(上调用.catch()
。如果未处理被拒绝的承诺(没有捕获(,则会出现此错误。
编辑2:哎呀。对不起,误读了你的问题,但我想解释保持不变。 如果res
没有json()
方法,则在调用res.json()
时将引发以下错误:
Uncaught TypeError: res.json() is not a function
此error
将被您的.catch()
块捕获。现在 catch 块将返回一个新的被拒绝的承诺。当调用函数并且没有catch()
来处理请求时,将抛出您正在谈论的错误。
我在这里解释了更多。
Try/catch 仅适用于使用异步函数包装异步操作时的操作。
fetchSomething = async url => {
try {
await fetch(url)
} catch (error) {
// We will see error here
}
}
在此处查看捕获异步错误的其他方法:https://dev.to/sobiodarlington/better-error-handling-with-async-await-2e5m