使用Node.js异步fs.writeFile()时,如何获知已保存的文件?
问题
我有如下代码,希望在fileSaveHandler中获知刚保存的具体文件:
import fs from "fs"; class MyClass { saveFiles() { // 循环处理1000000个文件 for loop { fs.writeFile(uploadFilePath, file.buffer, this.fileSaveHandler); } } fileSaveHandler(error: any = null) { // 这里要知道刚保存的是哪个文件? // 需要在这里做其他操作 } }
看起来Node.js里这么写好像实现不了需求,而且我不想使用Promise或者内联回调。
解决方案
用闭包就能实现,既不用Promise,也不用把回调逻辑内联在循环里,具体修改如下:
import fs from "fs"; class MyClass { saveFiles() { // 假设这里有存放所有文件路径的数组yourFilePathsArray for (const uploadFilePath of yourFilePathsArray) { // 为当前文件路径生成绑定好的回调函数 const boundHandler = this.getBoundSaveHandler(uploadFilePath); fs.writeFile(uploadFilePath, file.buffer, boundHandler); } } // 创建绑定了文件路径的回调,通过闭包保留当前路径 getBoundSaveHandler(filePath) { return (error) => { // 这里直接就能拿到刚保存的文件路径 if (error) { console.error(`保存文件 ${filePath} 失败:`, error); return; } console.log(`文件 ${filePath} 保存成功`); // 在这里执行你需要的后续操作 }; } }
简单来说,每次循环时调用getBoundSaveHandler并传入当前文件路径,这个方法返回的回调函数会通过闭包“记住”对应的路径。当fs.writeFile完成触发回调时,就能直接获取到该文件的路径,完全满足你的需求。
内容的提问来源于stack exchange,提问作者1.21 gigawatts
相关产品推荐
相关产品推荐

