Вопрос о завершении запроса для пакета запроса узла / JS - PullRequest
0 голосов
/ 09 сентября 2018

Я пытаюсь понять, что .on ('end', ...) делает в запросе пакета узла.

Мой код:

const fs = require('fs');
const request = require('request');

function downloadAsset(relativeAssetURL, fileName) {
  return new Promise((resolve, reject) => {
    try {
      let writeStream = fs.createWriteStream(fileName);
      var remoteImage = request(`https:${relativeAssetURL}`);
      remoteImage.on('data', function(chunk) {
        writeStream.write(chunk);
      });
      remoteImage.on('end', function() {
        let stats = fs.statSync(fileName);
        resolve({ fileName: fileName, stats: stats });
      });
    } catch (err) {
      reject(err);
    }
  });
}

Что яПопытка сделать это - загрузить удаленное изображение, получить некоторую статистику файла и затем разрешить обещание, чтобы мой код мог выполнять другие действия.

Я обнаружил, что обещание не всегда разрешается после файлабыл загружен;это может решить немного раньше.Я подумал, что для этого .on ('end', ...) был.

Что я могу сделать, чтобы разрешить это обещание после полной загрузки образа?

1 Ответ

0 голосов
/ 09 сентября 2018

Как документы говорят:

Метод writable.write() записывает некоторые данные в поток и вызывает предоставленный обратный вызов после полной обработки данных.

Итак, writable.write() является асинхронным . Тот факт, что ваш последний writeStream.write был вызван, не обязательно означает, что все операции записи были завершены. Вы, вероятно, хотите вызвать метод .end, что означает:

Вызов метода writable.end () сигнализирует о том, что больше данных не будет записано в Writable. Необязательные аргументы блока и кодирования позволяют записать один последний дополнительный блок данных непосредственно перед закрытием потока. Если предусмотрено, дополнительная функция обратного вызова присоединяется в качестве прослушивателя события 'finish'.

Итак, попробуйте позвонить writeStream.end, когда запрос remoteImage закончится, и передать обратный вызов writeStream.end, который разрешает Promise после завершения записи:

function downloadAsset(relativeAssetURL, fileName) {
  return new Promise((resolve, reject) => {
    try {
      const writeStream = fs.createWriteStream(fileName);
      const remoteImage = request(`https:${relativeAssetURL}`);
      remoteImage.on('data', function(chunk) {
        writeStream.write(chunk);
      });
      remoteImage.on('end', function() {
        writeStream.end(() => {
          const stats = fs.statSync(fileName);
          resolve({ fileName: fileName, stats: stats });
        });
      });
    } catch (err) {
      reject(err);
    }
  });
}

(также старайтесь не смешивать var и let / const - в среде ES6 + предпочитайте const, который обычно легче читать и имеет меньше проблем, например, подъем))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...