You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 20:06:00