流响应

¥Stream Response

将响应流式传输到客户端。

¥Stream response to the client.

使用流响应,它允许你在收到数据后立即将其发送到客户端。这对于大文件或长时间运行的响应非常有用。

¥Using stream responses It allows you to send data to the client as soon as you have it. This is useful for large files or long running responses.

创建流

¥Create a Stream

要流式传输响应,你首先需要使用 ReadableStream API 创建流:

¥To stream a response, you first need to create a stream using the ReadableStream API:

const stream = new ReadableStream();

为了举例,我们将创建一个启动函数,每 100 毫秒发送一个随机数。1000 毫秒后,它将关闭流:

¥For the example, we will create a start function that will send a random number every 100 milliseconds. After 1000 milliseconds, it will close the stream:

let interval: NodeJS.Timeout;
const stream = new ReadableStream({
  start(controller) {
    controller.enqueue("<ul>");

    interval = setInterval(() => {
      controller.enqueue("<li>" + Math.random() + "</li>");
    }, 100);

    setTimeout(() => {
      clearInterval(interval);
      controller.close();
    }, 1000);
  },
  cancel() {
    clearInterval(interval);
  },
});

发送流

¥Send a Stream

import { H3, setResponseHeader } from "h3";

export const app = new H3();

app.use((event) => {
  // Set to response header to tell to the client that we are sending a stream.
  setResponseHeader(event, "Content-Type", "text/html");
  setResponseHeader(event, "Cache-Control", "no-cache");
  setResponseHeader(event, "Transfer-Encoding", "chunked");

  let interval: NodeJS.Timeout;
  const stream = new ReadableStream({
    start(controller) {
      controller.enqueue("<ul>");

      interval = setInterval(() => {
        controller.enqueue("<li>" + Math.random() + "</li>");
      }, 100);

      setTimeout(() => {
        clearInterval(interval);
        controller.close();
      }, 1000);
    },
    cancel() {
      clearInterval(interval);
    },
  });

  return stream;
});

打开浏览器访问 http://localhost:3000,你应该会看到一个每 100 毫秒出现一次的随机数列表。

¥Open your browser to http://localhost:3000 and you should see a list of random numbers appearing every 100 milliseconds.

神奇!🎉

¥Magic! 🎉