编程语言
首页 > 编程语言> > javascript-是否有可能导致获取的text()函数抛出异常?

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);
    });

资源资源

> .text() on MDN
> Fetch Spec

无效的事情:

>专门发送回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切换为致命.

yutakahiranothis comment中进行确认.

文字可能会抛出

>如果请求在完成和使用之间被中止
>如果Content-Encoding响应标头与相应的实体不匹配

标签:fetch-api,javascript
来源: https://codeday.me/bug/20191109/2011698.html