Как документы говорят:
Метод 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
, который обычно легче читать и имеет меньше проблем, например, подъем))