Jer*_*ire 71 asynchronous readfile node.js
我无法弄清楚async/await是如何工作的.我稍微理解它,但我不能使它工作.
function loadMonoCounter() {
fs.readFileSync("monolitic.txt", "binary", async function(err, data) {
return await new Buffer( data);
});
}
module.exports.read = function() {
console.log(loadMonoCounter());
};
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用readFileSync,但是如果我这样做,我知道我永远不会理解async/await,我只会把问题埋没.
目标:调用loadMonoCounter()并返回文件的内容.
每次调用incrementMonoCounter()(每个页面加载)时,该文件都会递增.该文件包含二进制缓冲区的转储,并存储在SSD中.
不管我做什么,我在控制台中得到错误或未定义.
tad*_*man 133
要使用await/ async你需要返回promises的方法.没有包装器,核心API函数不会这样做promisify:
const fs = require('fs');
const util = require('util');
// Convert fs.readFile into Promise version of same
const readFile = util.promisify(fs.readFile);
function getStuff() {
return readFile('test');
}
// Can't use `await` outside of an async function so you need to chain
// with then()
getStuff().then(data => {
console.log(data);
})
Run Code Online (Sandbox Code Playgroud)
作为注释,readFileSync不进行回调,它返回数据或抛出异常.您没有获得所需的值,因为您提供的功能被忽略,而您没有捕获实际的返回值.
Joe*_*oel 48
由于Node v11.0.0 fs promises可以在没有以下情况的情况下本地使用promisify:
const fs = require('fs').promises;
async function loadMonoCounter() {
const data = await fs.readFile("monolitic.txt", "binary");
return new Buffer(data);
}
Run Code Online (Sandbox Code Playgroud)
HKT*_*Lee 40
这是@Joel 答案的 TypeScript 版本。它在 Node 11.0 之后可用:
import { promises as fs } from 'fs';
async function loadMonoCounter() {
const data = await fs.readFile('monolitic.txt', 'binary');
return Buffer.from(data);
}
Run Code Online (Sandbox Code Playgroud)
小智 27
fs.promises从 Node v11.0.0 开始,您可以使用本机可用
import fs from 'fs';
const readFile = async filePath => {
try {
const data = await fs.promises.readFile(filePath, 'utf8')
return data
}
catch(err) {
console.log(err)
}
}
Run Code Online (Sandbox Code Playgroud)
Non*_*714 14
为了保持简洁并保留以下所有功能fs:
const fs = require('fs');
const fsPromises = fs.promises;
async function loadMonoCounter() {
const data = await fsPromises.readFile('monolitic.txt', 'binary');
return new Buffer(data);
}
Run Code Online (Sandbox Code Playgroud)
导入fs和fs.promises单独导入将提供对整个fsAPI 的访问,同时还保持它的可读性......这样下一个示例就可以轻松完成。
// 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'));
Run Code Online (Sandbox Code Playgroud)
您可以像这样用promise轻松包装readFile命令:
async function readFile(path) {
return new Promise((resolve, reject) => {
fs.readFile(path, 'utf8', function (err, data) {
if (err) {
reject(err);
}
resolve(data);
});
});
}
Run Code Online (Sandbox Code Playgroud)
然后使用:
await readFile("path/to/file");
Run Code Online (Sandbox Code Playgroud)
从节点 v14.0.0
const {readFile} = require('fs/promises');
const myFunction = async()=>{
const result = await readFile('monolitic.txt','binary')
console.log(result)
}
myFunction()
Run Code Online (Sandbox Code Playgroud)