关于Nodejs异步文件处理的编程问题

发布于 1周前 作者 htzhanglong 来自 nodejs/Nestjs

关于Nodejs异步文件处理的编程问题
/**
* files [ ‘Orthogroups.txt’, ‘pfam_final.txt’, ‘txt.txt’, ‘txt2.txt’ ]
/

files.forEach(async file => {
const filrdir: string = path.join(TXTFilesPath, file);
if (file !== ‘txt.txt’ && file !== ‘txt2.txt’) {
return;
}
fs.stat(filrdir, (err, stats) => {
if (err) {
console.error(err);
return;
}
if (stats.isFile()) {
// 创建一个文件流
const inStream = fs.createReadStream(filrdir);
const rl = readline.createInterface(inStream);
console.log(‘filrdir’, filrdir);
// 开始解析操作
rl.on(‘line’, async line => {
const fastaName = line.split(’:’)[0];
const idList = line.split(’:’)[1];
let temList = idList.trim().split(’ ');
temList = […new Set(temList)];
try {
await temList.forEach((ele: string) => {
this.proteinObject[ele] = fastaName;
});
} catch (e) {
console.error(e);
}
});
}
});
});


files 是一个长度为 4 的数组,然后后面 filrdir 是能建立 txt.txt 与 txt2.txt 两个文件流的,但是最后 this.proteinObject 却始终只存储了一个文件的内容。我知道是异步的原因导致的,但是还是不理解。希望哪个大哥解解惑


4 回复

里面用了 this,但是所有层级都是箭头函数,箭头函数没有 this,冒泡查找 this 对象,那么外层遇到的第一个 this 就是当前代码所在的 module,也就是说你每次循环都共用了同一个 this,覆盖了同一个 this.proteinObject[ele]。

Array 的 forEach 以及 Readline 的 on 方法内传入的 callback 是异步执行的,比如你代码里针对 4 个文件名的 forEach 过程不会等着前一个处理完再处理下一个,而是一旦前一个进入了异步 io 过程下一个就开始处理了,几乎相当于同时在对两个 txt 进行 io 操作,如果希望能够同步顺序执行应该用 for 循环,处理过程用 async 函数或 promise 封装,在 for 循环里 await 调用,确保上一个处理完再进入下一个循环处理下一个。

不确定你要做什么,如果希望深入讨论的话,建议详细描述一下需求。

想感谢,但不会。。。

在Node.js中处理异步文件操作,通常我们会使用内置的fs模块(File System)。这个模块提供了一组异步方法,可以让我们在不阻塞事件循环的情况下读取、写入和处理文件。

以下是一个简单的示例,展示如何使用fs.readFilefs.writeFile来异步读取和写入文件:

const fs = require('fs');

// 异步读取文件
fs.readFile('input.txt', 'utf8', (err, data) => {
  if (err) {
    console.error('读取文件出错:', err);
    return;
  }
  console.log('文件内容:', data);

  // 对读取到的数据进行处理(例如,将其转换为大写)
  const processedData = data.toUpperCase();

  // 异步写入文件
  fs.writeFile('output.txt', processedData, 'utf8', (err) => {
    if (err) {
      console.error('写入文件出错:', err);
      return;
    }
    console.log('文件写入成功');
  });
});

在这个示例中,我们首先使用fs.readFile异步读取input.txt文件的内容。读取成功后,我们将内容转换为大写,然后使用fs.writeFile将处理后的内容写入output.txt文件。

需要注意的是,由于这些操作是异步的,所以在读取或写入文件时,Node.js可以继续处理其他任务,从而提高了程序的效率和响应速度。

希望这个示例能帮助你理解如何在Node.js中进行异步文件处理。如果你有任何其他问题或需要进一步的帮助,请随时提问。

回到顶部