使用 fetch 实现流式传输:焦点原理与实践

打印 上一主题 下一主题

主题 1834|帖子 1834|积分 5502

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
在当代前端开发中,流式传输(Streaming)技术越来越受到开发者的关注,尤其是在处置惩罚大文件、及时数据或需要逐步呈现内容的场景中。通过 fetch API 实现流式传输,可以在不壅闭 UI 的环境下逐步获取和处置惩罚数据,从而提升用户体验。
什么是流式传输?

流式传输是一种逐步获取数据的方式,不同于传统的请求相应模式(即一次性返回所有数据),流式传输答应你从服务器获取数据的同时,也能逐步处置惩罚数据。这种方式尤其适用于处置惩罚大规模数据(如视频、音频、大文件)或及时数据(如及时消息、及时日记等)的场景。
fetch API 与流式传输

fetch API 是当代欣赏器中用于发起 HTTP 请求的标准方法。它支持相应体的流式读取,使得开发者可以或许逐步处置惩罚相应数据,而无需等待完整的相应返回。这一功能通过 ReadableStream 接口实现,答应我们逐块读取相应数据。
1. 获取流式相应

fetch API 返回的 Response 对象包罗一个 body 属性,这个 body 是一个 ReadableStream,它代表着相应数据流。通过 ReadableStream,我们可以按需读取数据,而不是等待所有数据都被加载完成。
示例代码:
  1. const response = await fetch('https://example.com/large-file');
  2. const reader = response.body.getReader();
复制代码
getReader() 方法返回一个 ReadableStreamDefaultReader 对象,我们可以使用它来按块读取数据。
2. 逐步读取数据

ReadableStreamDefaultReader 提供了 read() 方法,它会返回一个包罗两个属性的对象:


  • done:一个布尔值,表现流是否已竣事。如果为 true,说明数据已经全部读取完毕。
  • value:当前读取的数据块,通常是一个 Uint8Array 范例。
通过循环调用 read() 方法,我们可以逐步读取流中的数据。
示例代码:
  1. const reader = response.body.getReader();
  2. let receivedLength = 0;
  3. let chunks = [];
  4. while (true) {
  5.   const { done, value } = await reader.read();
  6.   if (done) break;
  7.   receivedLength += value.length;
  8.   chunks.push(value);
  9.   console.log(`Received ${receivedLength} bytes`);
  10. }
  11. // 将数据块拼接成完整的内容
  12. const fullResponse = new TextDecoder().decode(Uint8Array.from(chunks));
复制代码
3. 解码和处置惩罚数据

value 返回的是一个 Uint8Array 范例的二进制数据,通常需要进行解码才能将其转换为文本内容。在 JavaScript 中,可以使用TextDecoder 对象来解码这些二进制数据。
  1. const text = new TextDecoder().decode(value);
复制代码
4. 竣事流式传输

当 done 为 true 时,表现数据已经读取完毕,我们可以停止循环并进行后续处置惩罚。
  1. const { done, value } = await reader.read();
  2. if (done) {
  3.   console.log("Streaming finished");
  4.   break;
  5. }
复制代码
5. 错误处置惩罚

在实际应用中,流式传输过程中大概会出现错误,因此需要进行错误处置惩罚。可以使用 try-catch 语句捕捉异常,并进行相应的处置惩罚。
  1. try {
  2.   const response = await fetch('https://example.com/large-file');
  3.   const reader = response.body.getReader();
  4.   // 处理流数据
  5. } catch (error) {
  6.   console.error('Error while fetching data:', error);
  7. }
复制代码
流式传输的应用场景

流式传输非常适合以下几种场景:
1. 大文件下载

在下载大文件时,使用流式传输可以制止一次性加载所有数据,减少内存消耗,提高效率。通过逐步读取数据,用户可以在下载过程中得到及时进度更新,甚至在下载完成之前开始处置惩罚文件的部分内容。
2. 及时数据传输

流式传输特别适合及时数据场景,例如及时聊天、股票行情更新、交际媒体流等。开发者可以逐步吸收并处置惩罚数据,及时更新 UI,提升用户体验。
3. 视频/音频流

流式传输常用于视频和音频的流式播放。在这种场景下,欣赏器会逐块下载视频或音频内容,并及时解码播放,确保用户可以或许平滑地观看或收听媒体内容,而无需等待完整文件下载完毕。
4. 处置惩罚大量文本数据

在需要处置惩罚大量文本数据的场景下(如大规模日记文件、长篇文章等),使用流式传输可以制止一次性加载所有数据导致的性能题目。开发者可以逐块处置惩罚文本,优化内存使用和相应时间。
总结

通过 fetch API 实现流式传输,可以有效提高大数据处置惩罚的效率和用户体验。无论是下载大文件、及时数据更新照旧媒体流传输,流式传输都能帮助开发者制止壅闭 UI、减少内存占用,并使得数据处置惩罚更加高效。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

乌市泽哥

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表