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 的浏览器中加载。