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①

瀏覽器相容性

另見