我不知道异步/等待是如何工作的。我稍微懂一点,但我不能让它工作。
function loadMonoCounter() {
fs.readFileSync("monolitic.txt", "binary", async function(err, data) {
return await new Buffer( data);
});
}
module.exports.read = function() {
console.log(loadMonoCounter());
};
我知道,我可以使用readFileSync,但如果我这样做,我知道我永远不会理解async/await,我只会埋葬这个问题。
目标:调用loadMonoCounter()并返回一个文件的内容。
每次调用incrementMonoCounter()时,该文件都会递增(每次加载页面)。该文件包含二进制缓冲区的转储,并存储在SSD上。
无论我做什么,我都在控制台中得到一个错误或未定义。
你可以很容易地用这样的承诺包装readFile命令:
async function readFile(path) {
return new Promise((resolve, reject) => {
fs.readFile(path, 'utf8', function (err, data) {
if (err) {
reject(err);
}
resolve(data);
});
});
}
然后使用:
await readFile("path/to/file");
我通过使用Promise读取文件。对我来说,这是正确的:
const fs = require('fs')
//function which return Promise
const read = (path, type) => new Promise((resolve, reject) => {
fs.readFile(path, type, (err, file) => {
if (err) reject(err)
resolve(file)
})
})
//example how call this function
read('file.txt', 'utf8')
.then((file) => console.log('your file is '+file))
.catch((err) => console.log('error reading file '+err))
//another example how call function inside async
async function func() {
let file = await read('file.txt', 'utf8')
console.log('your file is '+file)
}
为了保持简洁并保留fs的所有功能:
const fs = require('fs');
const fsPromises = fs.promises;
async function loadMonoCounter() {
const data = await fsPromises.readFile('monolitic.txt', 'binary');
return new Buffer(data);
}
导入fs和fs。单独的承诺将提供对整个fs API的访问,同时也保持它更可读…这样下一个例子就很容易完成了。
// the 'next example'
fsPromises.access('monolitic.txt', fs.constants.R_OK | fs.constants.W_OK)
.then(() => console.log('can access'))
.catch(() => console.error('cannot access'));