Как написать ответ в поток, не дожидаясь окончания выборки? - PullRequest
0 голосов
/ 12 июля 2020

Мне нужно получить аудиофайл и записать его в каталог. Меня беспокоит то, что мне нужно дождаться окончания загрузки, чтобы загрузить весь файл, а затем записать / сохранить в файл. Возможно ли получить аудиофайл и в то же время записать в файл. Я просто подумал, что это может быть как «труба». Получите фрагмент из службы и не дожидайтесь окончания процесса выборки, просто напишите фрагменты, которые только что загружаются в файл. Это возможно? Если да, то можете привести пример?

Вот мой код:


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()
    })
  })
}

1 Ответ

1 голос
/ 12 июля 2020

await fetch() не загружает весь файл (если он большой). Он читает первый фрагмент файла (в примере, который я рассматривал в отладчике, длина первого фрагмента составляла 16384 байта), извлекает из него заголовки и затем оставляет остальную часть этого первого фрагмента в потоке, ожидая считывания. .

Последующие части файла будут прочитаны после того, как вы выполните .pipe() и существующий поток будет очищен. Остальная часть файла будет прочитана кусками и записана на диск кусками. Чтобы проверить это, вам нужно будет использовать файл достаточно большого размера, чтобы для его чтения / записи потребовалось несколько фрагментов. читает и записывает, которые происходят после выполнения await fetch().

Итак, похоже, что ваш код уже делает то, что вам казалось интересным. Если страница, которую вы загружаете, небольшая (помещается внутри один буфер), вы не увидите множественных операций чтения / записи, потому что весь ответ может быть прочитан за один проход, но для более крупных ответов он определенно будет go частями. Размер блоков также может зависеть от того, как быстро данные прибывают из источника.

...