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 拒绝。