为啥在解构响应对象后会引发“无法在 'Response' 上执行 'json'”错误

Posted

技术标签:

【中文标题】为啥在解构响应对象后会引发“无法在 \'Response\' 上执行 \'json\'”错误【英文标题】:Why a "Failed to execute 'json' on 'Response'" error is raised after destructuring the response object为什么在解构响应对象后会引发“无法在 'Response' 上执行 'json'”错误 【发布时间】:2019-10-24 20:51:48 【问题描述】:

我正在实现我自己的使用fetch API 的fetch 方法。 在执行此操作时,我遇到了一个我无法解释的错误。

代码片段如下所示:

    const response: Response = await fetch(url, options);
    const  json  = response;

    return json();

问题是这段代码触发了一个promise拒绝:

TypeError: 无法在 'Response' 上执行 'json': 正文流被锁定

我知道json 方法只能调用一次,它确实如此。fetch 本身不会失败。如果我直接返回response.json(),则不会出现拒绝。

我的问题是为什么在response 对象上使用解构赋值,会锁定ReadableStream 响应的body

【问题讨论】:

【参考方案1】:

发生这种情况的原因是解构对象导致json 方法与response 的原始范围解耦。

一个解决方案是:

    const response: Response = await fetch(url, options);
    const  json  = response;

    return json.bind(response)();

【讨论】:

以上是关于为啥在解构响应对象后会引发“无法在 'Response' 上执行 'json'”错误的主要内容,如果未能解决你的问题,请参考以下文章

Vue3 解构赋值失去响应式引发的思考!

为啥对 fetch 响应使用解构赋值会导致 .json() 方法消失?

为啥 EF Scaffold-DbContext 命令在针对 net6.0 报告“未找到设计时服务”后会引发 NRE?

使用对象解构赋值时,为啥将属性“名称”转换为字符串? [复制]

当组件中有解构赋值时,为啥默认道具不能防止 TypeError?

toRefs 解构响应式数据