2017-10-14 112 views
1

fetchspecification指出可读流Body包含Body.bodyUsed标志,该标志初始设置为false,然后通过调用任何解析方法将其设置为true为什么读取Body对象只能读取一次?

下面是一个例子:

fetch('/some/path', (res) => { 
    // res.body.bodyUsed === false 
    res.json(); 
    // res.body.bodyUsed === true 
}); 

如果你试图再次拨打像res.json()res.text()的方法,则抛出异常。

问题是:为什么使用这种行为?为什么不允许根据需要多次解析可读的流?我没有发现此事的解释。

PS。在Chrome(也可能是其他浏览器)中,该标志可作为res.body.locked访问。

+1

阅读不止一次Response.body更'为什么这种行为是使用',因为它很容易让使用'Response.clone(多次使用)' - HTTPS://开发商.mozilla.org/zh-CN/docs/Web/API/Response/clone –

+1

它需要将主体存储在'res'对象中。 – Barmar

+0

@JaromandaX是的,但是这并没有回答下一个逻辑问题:为什么要把它限制在第一位,而是实现'clone()'。 –

回答

1

问题是:为什么会使用这种行为?为什么不允许解析 可读数据流多次?

有可能通过使用Response.clone()

+0

是的,我知道这件事。但是这并不能解释为什么要限制最明显的阅读方式。 –

+2

@PhilFilippak最简单的解释是确定什么时候Response.body被“耗尽”,但是请注意,这个概念也适用于'Request',并且在一定程度上兼容性和相应的实现与[Streams规范](https:// streams.spec.whatwg.org/),请参阅[建议的向后不兼容的更改:要求克隆所有请求/响应#61](https://github.com/whatwg/fetch/issues/61)。也许考虑提交一个[问题](https://github.com/whatwg/fetch/issues),向作者和贡献者说明你的具体问题。 – guest271314

+0

随着流的概念,它现在是有道理的。谢谢你的解释。你能在你的初步答案中提到Streams,所以我可以检查它是否被接受? –