Logo
开发文档
QQ频道

用 js fetch 写一个 stream 请求的代码

2023-09-15 18:08:13
|
浏览 337

技术问题:使用 JavaScript 的 Fetch API 编写一个流式(stream)请求的代码。

在 JavaScript 中,使用 Fetch API 可以进行网络请求,包括流式请求。流式请求是一种逐步获取数据的方式,适用于处理大型文件或数据流。下面是用 JavaScript Fetch API 发起流式请求的代码示例:

复制代码
// 创建一个 ReadableStream 对象,用于流式请求
function createStream(url) {
  // 创建一个 ReadableStream
  const stream = new ReadableStream({
    start(controller) {
      // 发起 Fetch 请求
      fetch(url)
        .then((response) => {
          const reader = response.body.getReader();
          function push() {
            // 读取数据
            return reader.read().then(({ done, value }) => {
              // 如果读取完成,则关闭流
              if (done) {
                controller.close();
                return;
              }
              // 将数据块传递给流
              controller.enqueue(value);
              // 继续读取下一个数据块
              return push();
            });
          }
          return push();
        })
        .catch((error) => {
          // 发生错误时,中断流并抛出异常
          controller.error(error);
        });
    },
  });
  
  return new Response(stream, { headers: { "Content-Type": "application/octet-stream" } });
}

// 使用流式请求
const streamUrl = "http://example.com/stream"; // 替换为实际的流式请求 URL
fetch(createStream(streamUrl)).then((response) => {
  // 通过 response.body.getReader().read() 逐步获取数据
  const reader = response.body.getReader();
  function process() {
    return reader.read().then(({ done, value }) => {
      // 处理数据,例如将数据分块显示在页面上
      console.log(value);
      if (done) {
        // 数据处理完成
        console.log("Stream processing finished.");
        return;
      }
      // 继续处理下一个数据块
      return process();
    });
  }
  return process();
});

上述代码中,createStream 函数用于创建一个可读流 (ReadableStream) 对象,并基于 Fetch API 发起请求。createStream 函数接受一个 URL 参数用于指定流式请求的地址。

在使用流式请求时,我们可以通过 response.body.getReader() 获取一个 ReadableStreamDefaultReader 对象,然后使用 reader.read() 逐步读取数据。在示例代码中的 process 函数中,我们通过递归调用 reader.read() 来逐步处理数据,直到数据全部读取完成。

请注意,以上代码仅作为示例,实际应用中需要根据具体需求进行适当修改和错误处理。

希望这篇文章能帮助到你,如果还有其他技术问题,欢迎继续提问。

我要提问
复制内容
分享给好友
AI编程问答网 免责声明:
以上内容除特别注明外均来源于网友提问,AI编程问答网回答,权益归原著者所有;