node.js - Node.js 使用 async/await 读取文件
问题描述
我正在尝试使用异步/等待代码来读取文件。这是我的代码:
var fs = require('fs');
function readFile(fileName) {
return new Promise(resolve => {
//console.log(test);
fs.readFile(fileName, 'utf8', function (err, data) {
if (err) throw err;
console.log(fileName)
console.log(data)
})
resolve();
});
}
async function run() {
await readFile('file1.txt');
await readFile('file2.txt');
readFile('file3.txt');
}
run();
但结果仍然是随机的。这意味着 file3 有时会在 file2 之前读取。我在哪里做错了?
解决方案
有很多方法可以实现这一目标。
其中大部分在此链接中进行了解释
我写一个简单的:
1)使用util.promisify
将回调方法转换为promise:
const fs = require('fs');
const util = require('util');
const readFile = (fileName) => util.promisify(fs.readFile)(fileName, 'utf8');
(async () => {
try {
const files = ['file1.txt', 'file2.txt', 'file3.txt'];
for (const file of files) {
console.log(
await readFile(file)
);
}
}
catch (error) {
console.error(error);
}
})();
2)*Sync
方法。由于您的代码不处理并发您可以使用*Sync
方法:
const fs = require('fs');
try {
const files = ['file1.txt', 'file2.txt', 'file3.txt'];
for (const file of files) {
console.log(
fs.readFileSync(file, 'utf8')
);
}
}
catch (error) {
console.error(error);
}
顺便提一句。这是您的固定代码:
var fs = require('fs');
function readFile(fileName) {
return new Promise((resolve, reject) => {
fs.readFile(fileName, 'utf8', function (error, data) {
if (error) return reject(error);
console.log(fileName)
console.log(data)
resolve();
})
});
}
async function run() {
await readFile('file1.txt');
await readFile('file2.txt');
await readFile('file3.txt');
}
run();
因为您正在调用 readFile 并以相同的异步序列解析它,所以它同时被调用,这是race condition
.
您必须等待回调处理然后解决它(在回调范围内)。
推荐阅读
- android - 如何知道 DEVELOPER_TRIGGERED_UPDATE_IN_PROGRESS 更新可用性来源的 AppUpdateType?
- java - 从用户那里获取字符和字符串
- coq - 我如何在 Coq 中为 sigma 类型做例子?
- r - R - 以不同方式聚合 data.table 列
- java - 无法从 some.jar 中提取模块名称:在顶级目录中找到了 some.class(模块中不允许使用未命名的包)
- javascript - JS:按值从数组中删除第一个元素
- hibernate-envers - 如果一组实体发生更改,如何仅审核,即向该集合添加更多实体(而不是实体本身)
- java - 如何做一个 Mapper 并返回 Single
? - linux - 在 x 毫秒内获取字符串中的值
- cytoscape.js - 如何使用 cytoscape.js 找到两个节点之间的所有路径?