有时候,可能需要以原始二进制格式查看和修改主体。为此,可以使用Body.arrayBuffer()将
主体内容转换为ArrayBuffer 实例。Body.arrayBuffer()方法返回期约,解决为将缓冲区转存得到
的ArrayBuffer 实例。下面的代码展示了在Response 对象上使用Body.arrayBuffer():
fetch(‘https://foo.com’)
.then((response) => response.arrayBuffer())
.then(console.log);
// ArrayBuffer(…) {}
以下代码展示了在Request 对象上使用Body.arrayBuffer():
let request = new Request(‘https://foo.com’,
{ method:‘POST’, body: ‘abcdefg’ });
// 以整数形式打印二进制编码的字符串
request.arrayBuffer()
.then((buf) => console.log(new Int8Array(buf)));
// Int8Array(7) [97, 98, 99, 100, 101, 102, 103]
5. Body.blob()
有时候,可能需要以原始二进制格式使用主体,不用查看和修改。为此,可以使用Body.blob()
将主体内容转换为Blob 实例。Body.blob()方法返回期约,解决为将缓冲区转存得到的Blob 实例。
下面的代码展示了在Response 对象上使用Body.blob():
fetch(‘https://foo.com’)
.then((response) => response.blob())
.then(console.log);
// Blob(…) {size:…, type: “…”}
以下代码展示了在Request 对象上使用Body.blob():
let request = new Request(‘https://foo.com’,
{ method:‘POST’, body: ‘abcdefg’ });
request.blob()
.then(console.log);
// Blob(7) {size: 7, type: “text/plain;charset=utf-8”}
6. 一次性流
因为Body 混入是构建在ReadableStream 之上的,所以主体流只能使用一次。这意味着所有主
体混入方法都只能调用一次,再次调用就会抛出错误。
fetch(‘https://foo.com’)
.then((response) => response.blob().then(() => response.blob()));
// TypeError: Failed to execute ‘blob’ on ‘Response’: body stream is locked
let request = new Request(‘https://foo.com’,
{ method: ‘POST’, body: ‘foobar’ });
request.blob().then(() => request.blob());
// TypeError: Failed to execute ‘blob’ on ‘Request’: body stream is locked
即使是在读取流的过程中,所有这些方法也会在它们被调用时给ReadableStream 加锁,以阻止
其他读取器访问:
fetch(‘https://foo.com’)
.then((response) => {
response.blob(); // 第一次调用给流加锁
response.blob(); // 第二次调用再次加锁会失败
});
// TypeError: Failed to execute ‘blob’ on ‘Response’: body stream is locked
let request = new Request(‘https://foo.com’,
{ method: ‘POST’, body: ‘foobar’ });
request.blob(); // 第一次调用给流加锁
request.blob(); // 第二次调用再次加锁会失败
// TypeError: Failed to execute ‘blob’ on ‘Request’: body stream is locked
作为Body 混入的一部分,bodyUsed 布尔值属性表示ReadableStream 是否已摄受(disturbed),
意思是读取器是否已经在流上加了锁。这不一定表示流已经被完全读取。下面的代码演示了这个属性:
let request = new Request(‘https://foo.com’,
{ method: ‘POST’, body: ‘foobar’ });
let response = new Response(‘foobar’);
console.log(request.bodyUsed); // false
console.log(response.bodyUsed); // false
request.text().then(console.log); // foobar
response.text().then(console.log); // foobar
console.log(request.bodyUsed); // true
console.log(response.bodyUsed); // true
11-10
1万+
09-17
1万+
01-30
435
04-26
1万+