You need to enable JavaScript to run this app.
导航

Streams

最近更新时间2024.05.17 17:37:16

首次发布时间2023.02.15 19:04:53

ReadableStream

详细定义及用法参见MDN官方文档ReadableStream.ReadableStream

限制

Constructor未实现。

ReadableStreamDefaultReader

详细定义及用法参见MDN官方文档 ReadableStreamDefaultReader

WritableStream

详细定义及用法参见MDN官方文档WritableStream

限制

Constructor未实现。

WritableStreamDefaultWriter

TransformStream

详细定义及用法参见MDN官方文档TransformStream

限制

  • 构造函数只支持空参数,即不接受任何参数。
  • TransformStream 的底层实现大量使用了零拷贝的方法,但在某些情况下,可能需要进行缓冲。如果使用不当,可能导致死锁。
  • 在读取 TransformStream 时,应避免在同一个异步函数中同时使用 await readable 和 writable ,尤其是先使用 await writable。通常,writable应放在一个专门的匿名异步函数中发送数据,而readable可以自由使用。

示例

// 该示例演示了如何自动生成数据并将其作为响应发送回去
addEventListener('fetch', (event) => {
  event.respondWith(handle(event));
});

async function handle(event) {
  const {readable, writable} = new TransformStream();
  async function controller() {
    const writer = writable.getWriter();
    for (let i = 0; i < 1000; ++i) {
      await writer.write('Hello World');
    }
    await writer.close();
  }

  // 启动controller函数,但不等待该函数完成。如果等待controller,并且写入的数据过大,可能会导致死锁。
  controller();

  // 返回可读流。由于TransformStream将可读流和可写流关联起来,我们可以直接返回可读流,而不需要等待controller完成。
  // controller会在后台运行,而可读流会持续读取数据,确保controller可以自动运行完成。
  return readable;
}

// 以上代码会输出1000次'Hello World'。