我在使用此代码时遇到麻烦:
fetch('/example.json')
.then(response => Promise.all([response, response.json()])) // This line throws unhandled exception: SyntaxError: Unexpected token < in JSON at position 0
.then(([response, json]) => {
if (!response.ok) {
throw new Error(JSON.stringify(json));
}
return json;
})
.catch(exception => {
const error = new Map([
[TypeError, ["There was a problem fetching the response."]],
[SyntaxError, ["There was a problem parsing the response."]],
[Error, JSON.parse(exception.message)]
]).get(exception.constructor);
return { error };
})
在大多数情况下它可以正常工作,但是当服务器的响应为200 OK时失败,但是实际内容是HTML。我知道这是服务器上的错误,但是我只希望我的客户端正确处理它。也就是说,它应该在最终捕获时捕获到response.json()异常。
我在做什么错了?
答案 0 :(得分:3)
通过Bergi的评论发现了问题。
调用JSON.parse(exception.message)不管您遇到的实际异常是一个坏主意。
渔获物上的那条线在渔获物内引起了第二次异常,从而造成了所有麻烦。
即使未选中“暂停捕获的异常”,devtool也会停止,这似乎不适用于Promise捕获:https://bugs.chromium.org/p/chromium/issues/detail?id=465666