Key*_*yKi 7 javascript json fetch
对于从fetch接收到的 JSON,Body.json()是否比JSON.parse(responseText )快?
理论上Body.json()可以在其从接收第一字节尽快开始解码JSON ReadableStream从fetch。这是它的工作原理吗?还是等到所有字节都收到?
const response = await fetch(url);
const json = await response.json();
Run Code Online (Sandbox Code Playgroud)
const response = await fetch(url);
const text = await response.text();
const json = JSON.parse(text);
Run Code Online (Sandbox Code Playgroud)
那么,这些版本的代码之间有区别吗?
您是正确的,在获取时主体被消耗(并且主体是一个流),但是根据规范,当浏览器要消耗主体时,它必须先 使用流读取器读取该流中的所有字节,然后才能“ [r] 返回由执行处理程序转换承诺的结果,该处理程序返回包数据算法的结果“。
这意味着在Body.json()甚至可以调用它的第一步utf-8-decode 之前,整个主体必须已经被读取为 Uint8Array,这同样适用于所有包数据类型。
那么我们可以得出结论
fetch( url )
.then( body => body.json() );
Run Code Online (Sandbox Code Playgroud)
实际上是语法糖
fetch( url )
.then( body => body.arrayBuffer() )
.then( bytes => new TextDecoder().decode( bytes ) )
.then( text => JSON.parse( text ) );
Run Code Online (Sandbox Code Playgroud)
然后
fetch( url )
.then( body => body.text() );
Run Code Online (Sandbox Code Playgroud)
本身就是语法糖
fetch( url )
.then( body => body.arrayBuffer() )
.then( bytes => new TextDecoder().decode( bytes ) )
Run Code Online (Sandbox Code Playgroud)
因此,如果您添加自己的.then( text => JSON.parse( text ) ),您实际上会执行完全相同的操作。
| 归档时间: |
|
| 查看次数: |
206 次 |
| 最近记录: |