node.js - 如何等待 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 []
})();
解决方案
你可以在这里做很多不同的事情。(请注意,在下面的代码示例中,我特意简化了一些内容以使其更易于阅读)您可以
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 时,知道如何去做是值得的。
推荐阅读
- flutter - 如何知道是什么触发了我的 Flutter 小部件重建
- bash - 如何使用并行命令来加速 shell 脚本?
- elasticsearch - 寻找支持实体重复数据删除的库
- python-3.x - Subclassing and preserving the names of args and kwargs in python in help()
- c - 简单的浮点乘法没有给出预期的结果
- python - Python FileStorage:读取 XML 文件
- python - Pyspark 将所有数据帧值增加 1
- java - Webview 显示不需要的对话框
- list - 是否有用于将平面列表转换为嵌套列表的 Dart 实用程序?
- mysql - 异步功能等待不等待