javascript-是否有可能导致获取的text()函数抛出异常?
作者:互联网
在现代浏览器(或node polyfill)中使用fetch API,是否有可能生成一种情况,其中在Response的正文上调用text()可能会抛出?
对于不熟悉的人,调用fetch返回一个Promise.然后,可以在连续的then()回调中操作该承诺.通常,将使用.json()或.text()函数分别将Response的主体转换为JSON或纯文本.
通过返回无法解析为JSON的内容,可以简单地抛出json()函数.这样做将导致.json()以与JSON.parse()相同的方式引发.但是,我一直找不到.text()可以抛出的场景.
我对Fetch Spec的粗略检查并没有发现导致它抛出的方法,尽管它也没有提到.json()可能会抛出任何一个.
这是一些示例代码,可以说明这种情况:
const options = {
method: 'GET',
credentials: 'same-origin',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json',
}
};
fetch('/my-api-endpoint/', options)
.then((response) => {
// Assume we get here and fetch didn't fail before this point
return response.text();
})
.catch((e) => {
// How do we get here? Is it possible?
console.log('text() threw');
console.log(e);
}).then((text) => {
// We don't want to get here.
console.log(text);
});
资源资源
无效的事情:
>专门发送回JSON作为对象-text()将其转换为'[object Object]’
>正常发送回JSON-text()以字符串形式返回JSON字符串(与无效JSON或非JSON字符串相同)
>发送回null或未定义-text()返回空字符串
>人工构造一个Response并将主体值指定为null或未定义-text()返回空字符串
解决方法:
Is it possible to cause a fetch’s text() function to throw?
这是不可能的,因为文本运行replacement mode decoder.此外,您不能将解码器的error mode切换为致命.
yutakahirano在this comment中进行确认.
文字可能会抛出
>如果请求在完成和使用之间被中止
>如果Content-Encoding响应标头与相应的实体不匹配
标签:fetch-api,javascript 来源: https://codeday.me/bug/20191109/2011698.html