【问题标题】:Is it possible to cause a fetch's text() function to throw?是否有可能导致 fetch 的 text() 函数抛出?
【发布时间】:2018-09-21 23:29:14
【问题描述】:

在现代浏览器中使用 fetch API(或node polyfill),是否可以生成在响应主体上调用 text() 可能会抛出的场景?

对于不熟悉的人,调用 fetch 返回一个 Promise。然后可以在顺序 then() 回调中对该承诺进行操作。通常,可以分别使用 .json() 或 .text() 函数将响应的正文转换为 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() 返回空字符串
  • 人为构造响应并将正文值指定为 null 或未定义 - text() 返回空字符串

【问题讨论】:

  • 也许.text() 不能投掷,但fetch('/my-api-endpoint/', options) 可以投掷,而且您假设只有.text 投掷。您在 2 个承诺之后提出了问题:fetch(...)response.text()
  • @HMR 感谢您的回复。是的,fetch 可以抛出。这就是为什么我发表评论“假设我们到达这里并且在此之前 fetch 没有失败”。如果我们达到了这一点,那么我们就知道 fetch 没有抛出。我的代码库解释了 fetch 已经可以抛出的事实,但这是关于 text() 函数的问题。

标签: javascript fetch-api


【解决方案1】:

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

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

yutakahiranothis comment 中确认。

text 可能会抛出

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

【讨论】:

  • 感谢您的确认。
  • @Dwight - 如果您没有收到通知(我认为没有),Knu 会在几个月后将他们的回答颠倒过来。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-23
  • 1970-01-01
  • 2014-06-08
  • 2019-11-21
  • 2012-06-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多