Возврат из функции Async после завершения загрузки и сохранения файла в NodeJS
У меня есть последовательность событий, которая выглядит примерно так:
//Download a file and write it to disk
await downloadSyncFile(user, downloadURL)
//Use the file...
await useTheFile() //Crash! The file is only partially there! Dangit!
Мой код продолжает двигаться до того, как файл фактически окажется на диске. Вот моя функция загрузки:
async function downloadSyncFile(user, downloadURL){
//Setup download path
let path = './data/'+user+'/file.whatevs'
try{
//Download and save file
let stream = fs.createWriteStream(path)
let response = await axios.get(downloadURL, { responseType: 'stream' })
response.data.pipe(stream)
await new Promise(fulfill => stream.on('finish', fulfill))
}catch(error){
console.log('downloadSyncFile Error: '+error)
return { success: false, message: error }
}
}
Tthe downloadSyncFile()
функция, похоже, возвращается после axios
загрузка завершается, но запись на диск не выполняется.
Как я могу убедиться, что файл безопасно записан на диск перед downloadSyncFile()
возвращается?
1 ответ
Решение
Вы не возвращаете обещание от downloadSyncFile()
.
+ Изменить
await new Promise(fulfill => stream.on('finish', fulfill));
к
return new Promise(fulfill => stream.on('finish', fulfill));
Лучше было бы написать так:
async function downloadSyncFile(user, downloadURL) {
return new Promise((fulfill, reject) => {
let path = './data/' + user + '/file.whatevs';
let stream = fs.createWriteStream(path);
let response = await axios.get(downloadURL, { responseType: 'stream' });
response.data.pipe(stream);
stream.on('finish', fulfill));
stream.on('error', reject); // presumably
});
}
Со всем завернутым new Promise(...)
, try{} catch() {}
не требуется, поскольку любая синхронная ошибка приведет к отклонению обещания.