节点请求-完成后是否要返回路径/文件名?或任何最佳做法建议

时间:2018-09-30 19:03:22

标签: javascript node.js es6-promise

我正在尝试异步下载文件。我可以使用Promises做到这一点。我正在尝试弄清楚一旦完成文件修补程序将如何返回。我真费劲地试图弄清楚如何让这件事等到文件已写入磁盘。

如果有更好的方法,而无需使用回电,我将乐意提供任何建议。

这是我的职能。

async function downloadFile(urlToFile, filename) {
  return new Promise( resolve => {
    const download = request({ url: urlToFile, followAllRedirects: true }).pipe(fs.createWriteStream(filename).on('finish', resolve));
  });
};

我在另一个文件中等待它。

1 个答案:

答案 0 :(得分:2)

可写流的事件finish实际上并不意味着一切都完成了。它仅表示将数据写入相关文件的过程已完成。那时,文件描述符仍在打开,文件尚未准备好使用。如果要检查是否真的完成所有操作,则需要使用事件close

async function downloadFile(urlToFile, filename) {
  return new Promise( (resolve, reject) => {
    const fstream = fs.createWriteStream(filename);
    fstream.on('close', resolve);
    fstream.on('error', reject);
    const download = request({ url: urlToFile, followAllRedirects: true }).pipe(fstream);
  });
};