首页 > 解决方案 > 如何等待 fs.readFile?

问题描述

我在等待fs.readFile() 我有一个文件时遇到问题,我想在其中迭代每一行,并将非重复的内容保存在 arraydomains中。

但是,当我调用我的函数时fs.readFile,我调用的console.log(domains)域是空的。

代码

var fs = require("fs");
var re = /@(.*?):/;
let domains = [];

const parseProviders = () => {
    fs.readFile("file.txt", (error, data) => {
    if (error) throw error;
    data
      .toString()
      .split("\n")
      .forEach((line, index, arr) => {
        try {
          line = line.match(re)[1];
          if(!domains.includes(line)) {
            domains.push(line);
          }
        } catch (err) {
          throw err;  
        }
      });
      console.log(domains); // this would work and print an array with non-duplicate items
  });
}

(() => {
  parseProviders();
  console.log(domains); // prints an empty array []
})();

标签: node.js

解决方案


你可以在这里做很多不同的事情。(请注意,在下面的代码示例中,我特意简化了一些内容以使其更易于阅读)您可以

1. 修改您的函数以获取由 readfile 回调执行的回调

const parseProviders = (callback) => {
    fs.readFile("file.txt", (error, data) => {
      data
        .toString()
        .split('\n')
        .forEach(line => domains.push(line))
    });
  });
}

(() => {
  parseProviders(() => {
    console.log(domains);
  });
})();

2. 使用fs/promises@robertklep 在评论中建议的模块。如果你这样做,你应该把它变成一个异步函数

const  { readFile } = require("fs/promises")

const parseProviders = async (callback) => {
    const data = await readFile("file.txt")
    data
      .toString()
      .split('\n')
      .forEach(line => domains.push(line))
  });
}

(async () => {
  await parseProviders()
  console.log(domains);
})();

3.手动promisify readFile函数。

const parseProviders = () => {
    return new Promise((accept, reject) => {
      fs.readFile("file.txt", (error, data) => {
      data
        .toString()
        .split('\n')
        .forEach(line => domains.push(line))
        accept();
      });
  });
}

(async () => {
  await parseProviders()
  console.log(domains);
})();
  • 注意 - 你不需要这样做,但是当你处理其他回调风格的 API 时,知道如何去做是值得的。

推荐阅读