Response: arrayBuffer() 方法

Baseline 已广泛支持

此特性已得到良好确立,可跨多种设备和浏览器版本使用。自 2017 年 3 月起,所有浏览器均支持此特性。

注意:此功能在 Web Workers 中可用。

Response 接口的 arrayBuffer() 方法会读取一个 Response 流并将其读取完毕。它返回一个使用 ArrayBuffer 解析的 Promise。

语法

js
arrayBuffer()

参数

无。

返回值

返回一个使用 ArrayBuffer 解析的 Promise。

异常

AbortError DOMException

请求已被 中止

TypeError

因以下原因之一而抛出:

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() 构造函数接受 FileBlob,因此它可以用于将 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①

浏览器兼容性

另见