
本文介绍了如何使用 JavaScript 的 Streams API 中的 TransformStream 将 ReadableStream 对象分割成行。通过创建一个自定义的 LineSplitter 类,该类继承自 TransformStream,可以有效地处理跨越多个数据块的行,并确保每一行都完整地传递给下游的消费者。该方法避免了简单地按块分割可能导致的不完整行的问题,提供了一种可靠的按行读取 ReadableStream 的解决方案。
ReadableStream 是一种强大的 API,用于处理流式数据,例如从网络请求返回的数据。然而,直接按块读取数据可能不方便,特别是当需要按行处理数据时。本教程将演示如何使用 TransformStream 将 ReadableStream 分割成行,确保每一行都完整地传递给下游的消费者。
TransformStream 允许我们在读取流的过程中转换数据。它接受一个 transform 函数和一个 flush 函数作为参数。
以下是一个自定义的 LineSplitter 类,它继承自 TransformStream,用于将 ReadableStream 分割成行。
function concatArrayBuffers(chunks: Uint8Array[]): Uint8Array {
const result = new Uint8Array(chunks.reduce((a, c) => a + c.length, 0));
let offset = 0;
for (const chunk of chunks) {
result.set(chunk, offset);
offset += chunk.length;
}
return result;
}
class LineSplitter extends TransformStream<Uint8Array, Uint8Array> {
protected _buffer: Uint8Array[] = [];
constructor() {
super({
transform: (chunk, controller) => {
let index;
let rest = chunk;
while ((index = rest.indexOf(0x0a)) !== -1) {
controller.enqueue(concatArrayBuffers([...this._buffer, rest.slice(0, index + 1)]));
rest = rest.slice(index + 1);
this._buffer = [];
}
if (rest.length > 0) {
this._buffer.push(rest);
}
},
flush: (controller) => {
if (this._buffer.length > 0) {
controller.enqueue(concatArrayBuffers(this._buffer));
}
}
});
}
}代码解释:
concatArrayBuffers 函数: 该函数用于将多个 Uint8Array 合并成一个 Uint8Array。这是因为我们需要将缓冲区中的数据块和当前块的一部分合并成一行。
LineSplitter 类:
以下是如何使用 LineSplitter 的示例:
const linesStream = (await fetch('http://example.com')).body
.pipeThrough(new LineSplitter());
for await (const line of linesStream.pipeThrough(new TextDecoderStream())) {
console.log(line);
}代码解释:
通过使用 TransformStream,我们可以轻松地将 ReadableStream 分割成行,从而更方便地处理流式数据。LineSplitter 类提供了一个可重用的解决方案,可以用于处理各种类型的 ReadableStream,并确保每一行都完整地传递给下游的消费者。这种方法避免了简单地按块分割可能导致的不完整行的问题,提供了一种可靠的按行读取 ReadableStream 的解决方案。
以上就是使用 TransformStream 将 ReadableStream 分割成行的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号