是否有可能导致fetch的text()函数抛出?

时间:2018-04-11 23:41:40

标签: javascript fetch-api

在现代浏览器(或node polyfill)中使用fetch API,是否可以生成一个方案,在该方案中,响应主体上的调用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或undefined - text()返回空字符串
  • 人工构造响应并将body值指定为null或undefined - text()返回空字符串

1 个答案:

答案 0 :(得分:3)

  

是否可以导致fetch的text()函数抛出?

这是不可能的,因为text运行replacement mode decoder;此外,您无法将解码器的error mode切换为fatal

yutakahiranothis comment确认。

text可能会抛出

  • 如果请求在完成和消费之间中止
  • 如果Content-Encoding响应标头与相应的entity-body
  • 不匹配