如何在不等待获取结束的情况下将响应写入流?
How to write response to stream without waiting end of the fetch?
我需要获取音频文件并写入目录。我担心我必须等待提取结束才能下载所有文件,然后 write/save 到文件。是否可以获取音频文件并同时写入文件。我只是认为它可能像“管道”。从服务获取块,不要等到获取过程结束,只需将刚刚下载到文件的块写入。那可能吗?如果是,你能举个例子吗?
这是我的代码:
const fetchAndWriteFiles = async (url, path) => {
const res = await fetch(url)
const fileStream = fs.createWriteStream(path)
await new Promise((resolve, reject) => {
res.body.pipe(fileStream)
res.body.on('error', err => {
reject(err)
})
fileStream.on('finish', function () {
resolve()
})
})
}
await fetch()
不会下载整个文件(如果文件很大)。它读取文件的第一个块(在我在调试器中查看的示例中,第一个块长 16384 字节),从中提取 headers 然后将第一个块的其余部分留在流中等待待读。
在您执行 .pipe()
并且清空现有流后,将读取文件的后续部分。文件的其余部分将以块的形式读取并以块的形式写入磁盘。要对此进行测试,您必须使用一个足够大的文件,它需要多个块才能 read/write 它。
而且,事实上,当我在下载更大的响应时进行检测时,我看到 await fetch()
完成后发生了多次读写。
因此,您的代码似乎已经在做您似乎感兴趣的事情。如果您正在下载的页面很小(适合一个缓冲区),您将看不到多个 reads/writes 因为整个响应可以一次读取,但对于较大的响应,它肯定会分块读取。块的大小也可能取决于数据从源到达的速度。
我需要获取音频文件并写入目录。我担心我必须等待提取结束才能下载所有文件,然后 write/save 到文件。是否可以获取音频文件并同时写入文件。我只是认为它可能像“管道”。从服务获取块,不要等到获取过程结束,只需将刚刚下载到文件的块写入。那可能吗?如果是,你能举个例子吗?
这是我的代码:
const fetchAndWriteFiles = async (url, path) => {
const res = await fetch(url)
const fileStream = fs.createWriteStream(path)
await new Promise((resolve, reject) => {
res.body.pipe(fileStream)
res.body.on('error', err => {
reject(err)
})
fileStream.on('finish', function () {
resolve()
})
})
}
await fetch()
不会下载整个文件(如果文件很大)。它读取文件的第一个块(在我在调试器中查看的示例中,第一个块长 16384 字节),从中提取 headers 然后将第一个块的其余部分留在流中等待待读。
在您执行 .pipe()
并且清空现有流后,将读取文件的后续部分。文件的其余部分将以块的形式读取并以块的形式写入磁盘。要对此进行测试,您必须使用一个足够大的文件,它需要多个块才能 read/write 它。
而且,事实上,当我在下载更大的响应时进行检测时,我看到 await fetch()
完成后发生了多次读写。
因此,您的代码似乎已经在做您似乎感兴趣的事情。如果您正在下载的页面很小(适合一个缓冲区),您将看不到多个 reads/writes 因为整个响应可以一次读取,但对于较大的响应,它肯定会分块读取。块的大小也可能取决于数据从源到达的速度。