有许多方法可以实现这一点。
其中大部分在此链接中有解释。
我将编写简单的方法:
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
和resolve
,它们同时被调用,这就是出现竞争条件
的原因。
您需要等待回调处理完成,然后再解析它(在回调作用域内)。
resolve
放在异步调用的 外面,所以它会立即被解决。 - CertainPerformance