Return 在 NodeJS 中完成下载和文件保存后从异步函数
Return From Async Function After Download and File Save are Complete in 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 }
}
}
downloadSyncFile()
函数似乎在 axios
下载完成后返回,但尚未写入磁盘。
如何确保文件在 downloadSyncFile()
returns 之前安全写入磁盘?
你没有 return 来自 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() {}
是不必要的,因为任何同步错误都会导致 Promise 拒绝。
我有一系列事件是这样的:
//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 }
}
}
downloadSyncFile()
函数似乎在 axios
下载完成后返回,但尚未写入磁盘。
如何确保文件在 downloadSyncFile()
returns 之前安全写入磁盘?
你没有 return 来自 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() {}
是不必要的,因为任何同步错误都会导致 Promise 拒绝。