Node.js如何让代码等待pipe操作完成文件创建后再执行后续逻辑
问题根源
async关键字修饰的函数只有当内部返回一个Promise时,await才能等待到异步操作完成。原有代码中的func1内部调用的get是回调式API,res.pipe也是事件驱动的异步写入逻辑,func1执行后会立刻返回已完成的空Promise,因此await不会等待文件写入结束,就触发了func2的读取逻辑。
解决方法
将func1封装为返回Promise的形式,监听文件写入流的完成事件,写入结束后再resolve Promise,即可让await正确等待:
const fs = require('fs'); var get = require('get-file'); async function func1(){ return new Promise((resolve, reject) => { get('jonschlinkert/get-file', 'package.json', function(err, res) { if (err) { console.error(err); return reject(err); } var file = fs.createWriteStream('mani.json'); res.pipe(file); // 写入完成触发resolve file.on('finish', () => resolve()); // 写入出错触发reject file.on('error', (writeErr) => { console.error(writeErr); reject(writeErr); }); }); }) }; async function func2(){ await func1(); fs.readFile("./mani.json", "utf8", (err, jsonString) => { if (err) { console.log("Error reading file from disk:", err); return; } try { const test = JSON.parse(jsonString); console.log(test.files['main.js']); } catch (err) { console.log("Error parsing JSON string:", err); } }); }; func2();
如果需要统一异步写法,也可以将fs.readFile改为fs.promises.readFile用await调用,逻辑会更清晰。
内容的提问来源于stack exchange,提问作者Washu Hakubi
相关产品推荐
相关产品推荐

