ReadableStreamDefaultReader: read() 方法

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

read() 方法是 ReadableStreamDefaultReader 接口的一个方法,它返回一个 Promise,该 Promise 提供对流的内部队列中的下一个块的访问。

语法

js
read()

参数

无。

返回值

一个 Promise,它根据流的状态以结果完成/拒绝。不同的可能性如下

  • 如果存在一个块,则 Promise 将以以下形式的对象完成:{ value: theChunk, done: false }
  • 如果流变为已关闭,则 Promise 将以以下形式的对象完成:{ value: undefined, done: true }
  • 如果流变为出错,则 Promise 将被相关错误拒绝。

异常

TypeError

源对象不是 ReadableStreamDefaultReader,流没有所有者,或者 ReadableStreamDefaultReader.releaseLock() 被调用(当有待处理的读取请求时)。

示例

示例 1 - 简单示例

此示例展示了基本的 API 用法,但没有尝试处理诸如流块不在行边界上结束等复杂情况。

在此示例中,stream 是一个先前创建的自定义 ReadableStream。它使用使用 getReader() 创建的 ReadableStreamDefaultReader 进行读取。(有关完整代码,请参阅我们的 简单随机流示例)。每个块按顺序读取并作为 UTF-8 字节数组输出到 UI,直到流读取完毕,此时我们将从递归函数返回并打印整个流到 UI 的另一个部分。

js
function fetchStream() {
  const reader = stream.getReader();
  let charsReceived = 0;

  // read() returns a promise that fulfills
  // when a value has been received
  reader.read().then(function processText({ done, value }) {
    // Result objects contain two properties:
    // done  - true if the stream has already given you all its data.
    // value - some data. Always undefined when done is true.
    if (done) {
      console.log("Stream complete");
      para.textContent = result;
      return;
    }

    // value for fetch streams is a Uint8Array
    charsReceived += value.length;
    const chunk = value;
    let listItem = document.createElement("li");
    listItem.textContent = `Received ${charsReceived} characters so far. Current chunk = ${chunk}`;
    list2.appendChild(listItem);

    result += chunk;

    // Read some more, and call this function again
    return reader.read().then(processText);
  });
}

示例 2 - 按行处理文本

此示例展示了如何获取一个文本文件并将其作为文本行流进行处理。它处理流块不在行边界上结束的情况,以及从 Uint8Array 到字符串的转换。

js
async function* makeTextFileLineIterator(fileURL) {
  const utf8Decoder = new TextDecoder("utf-8");
  let response = await fetch(fileURL);
  let reader = response.body.getReader();
  let { value: chunk, done: readerDone } = await reader.read();
  chunk = chunk ? utf8Decoder.decode(chunk, { stream: true }) : "";

  let re = /\r\n|\n|\r/gm;
  let startIndex = 0;

  for (;;) {
    let result = re.exec(chunk);
    if (!result) {
      if (readerDone) {
        break;
      }
      let remainder = chunk.substr(startIndex);
      ({ value: chunk, done: readerDone } = await reader.read());
      chunk =
        remainder + (chunk ? utf8Decoder.decode(chunk, { stream: true }) : "");
      startIndex = re.lastIndex = 0;
      continue;
    }
    yield chunk.substring(startIndex, result.index);
    startIndex = re.lastIndex;
  }
  if (startIndex < chunk.length) {
    // last line didn't end in a newline char
    yield chunk.substr(startIndex);
  }
}

for await (let line of makeTextFileLineIterator(urlOfFile)) {
  processLine(line);
}

规范

规范
Streams 标准
# ref-for-default-reader-read①

浏览器兼容性

BCD 表格仅在启用 JavaScript 的浏览器中加载。

另请参阅