获取 API 等待已定义块大小的块

Posted

技术标签:

【中文标题】获取 API 等待已定义块大小的块【英文标题】:Fetch API await chunk of defined chunk size 【发布时间】:2021-08-31 04:19:58 【问题描述】:

我想获取一个 URL 并以定义大小的块处理响应。我也不想在等待整个块可用时阻塞。 Fetch API 中有类似的功能吗?

示例如下:

const response = await fetch(url)
const reader = response.body.getReader()
const chunk = await reader.read(CHUNK_SIZE) 

【问题讨论】:

【参考方案1】:

fetch() 支持像流一样被使用。见MDN reference here。看来您需要一些用于 ReadableStream 的样板代码...

代码如下:

const workOnChunk = (chunk) =>  console.log("do-work");

// Fetch your stuff  
fetch(url)
// Retrieve its body as ReadableStream
.then(response => response.body)

// Boilerplate for the stream - refactor it out in a common utility.
.then(rs => 
  const reader = rs.getReader();

  return new ReadableStream(
    async start(controller) 
      while (true) 
        const  done, value  = await reader.read();

        // When no more data needs to be consumed, break the reading
        if (done) 
          break;
        

        // Do your work: ¿¿ Checkout what value returns ¿¿
        workOnChunk(value)

        // Optionally append the value if you need the full blob later.
        controller.enqueue(value);
      

      // Close the stream
      controller.close();
      reader.releaseLock();
    
  )
)
// Create a new response out of the stream (can be avoided?)
.then(rs => new Response(rs))
// Create an object URL for the response
.then(response => response.blob())
.then(blob =>  console.log("Do something with full blob") 
.catch(console.error)


注意:nodejs-fetch API 并不完全相同。如果您使用的是 nodejs,请参阅nodeje-fetch's stream support。

【讨论】:

在您的示例中,await reader.read() 将读取任何可用字节?我想等到至少有CHUNK_SIZE 字节可用。 它将为您提供任何可用的东西。您可以check the length of chunk 并决定对其进行处理或将其放入列表中,直到它达到大小为止。

以上是关于获取 API 等待已定义块大小的块的主要内容,如果未能解决你的问题,请参考以下文章

如何获取已删除分区中inode的块设备中的偏移量

计算C中嵌套目录中文件的块大小

从 Rust 中的多个音频流中并行获取相同大小的块

gdb:给定一个地址,我可以找到包含它的已分配块吗?

1.4eigen中的块运算

php Magento 2:从phtml上的块获取当前URL