Response: arrayBuffer() 方法
注意:此功能在 Web Workers 中可用。
Response 接口的 arrayBuffer() 方法会读取一个 Response 流并将其读取完毕。它返回一个使用 ArrayBuffer 解析的 Promise。
语法
js
arrayBuffer()
参数
无。
返回值
返回一个使用 ArrayBuffer 解析的 Promise。
异常
AbortErrorDOMException-
请求已被 中止。
TypeError-
因以下原因之一而抛出:
- 响应体已被 干扰或锁定。
- 解码正文内容时出错(例如,因为
Content-Encoding标头不正确)。
RangeError-
创建关联的
ArrayBuffer时出现问题。例如,如果数据大小超过Number.MAX_SAFE_INTEGER。
示例
播放音乐
在我们 fetch array buffer 示例中,有一个播放按钮。按下后,将运行 getData() 函数。请注意,在播放完整音频文件之前,它会被下载。如果您需要在下载过程中播放 ogg(流式传输)- 请考虑使用 HTMLAudioElement。
js
new Audio("music.ogg").play();
在 getData() 中,我们使用 Request() 构造函数创建一个新的请求,然后使用它来获取 OGG 音轨。我们还使用 AudioContext.createBufferSource 来创建一个音频缓冲区源。当 fetch 成功时,我们使用 arrayBuffer() 从响应中读取一个 ArrayBuffer,使用 AudioContext.decodeAudioData() 解码音频数据,将解码后的数据设置为音频缓冲区源的缓冲区(source.buffer),然后将源连接到 AudioContext.destination。
当 getData() 执行完毕后,我们使用 start(0) 开始播放音频源,然后禁用播放按钮,这样在音频正在播放时就不会再次被点击(这会导致错误)。
js
function getData() {
const audioCtx = new AudioContext();
return fetch("viper.ogg")
.then((response) => {
if (!response.ok) {
throw new Error(`HTTP error, status = ${response.status}`);
}
return response.arrayBuffer();
})
.then((buffer) => audioCtx.decodeAudioData(buffer))
.then((decodedData) => {
const source = new AudioBufferSourceNode(audioCtx);
source.buffer = decodedData;
source.connect(audioCtx.destination);
return source;
});
}
// wire up buttons to stop and play audio
play.onclick = () => {
getData().then((source) => {
source.start(0);
play.setAttribute("disabled", "disabled");
});
};
读取文件
Response() 构造函数接受 File 和 Blob,因此它可以用于将 File 读取为其他格式。
html
<input type="file" />
js
function readFile(file) {
return new Response(file).arrayBuffer();
}
document
.querySelector("input[type=file]")
.addEventListener("change", (event) => {
const file = event.target.files[0];
const buffer = readFile(file);
});
规范
| 规范 |
|---|
| Fetch # ref-for-dom-body-arraybuffer① |
浏览器兼容性
加载中…