如何正确读取 async/await 文件?
How to read file with async/await properly?
我不知道 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());
};
我知道,我可以使用 readFileSync
,但如果我这样做,我知道我永远无法理解 async
/await
,我将把这个问题埋葬。
目标:调用loadMonoCounter()
和return一个文件的内容。
每次调用 incrementMonoCounter()
(每次加载页面)时,该文件都会递增。该文件包含二进制缓冲区的转储并存储在 SSD 上。
无论我做什么,我都会在控制台中收到错误或 undefined
。
要使用 await
/async
,您需要 return 承诺的方法。如果没有像 promisify
:
这样的包装器,核心 API 函数就不会这样做
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);
})
请注意,readFileSync
不接受回调,它 return 发送数据或抛出异常。你没有得到你想要的值,因为你提供的那个函数被忽略了,你没有捕获实际的 return 值。
自从 Node v11.0.0 fs promises 在没有 promisify
的情况下本机可用:
const fs = require('fs').promises;
async function loadMonoCounter() {
const data = await fs.readFile("monolitic.txt", "binary");
return Buffer.from(data);
}
这是@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);
}
您可以轻松地用这样的承诺包装 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");
您可以使用 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)
}
}
有一个fs.readFileSync( path, options )
方法,是同步的
为了保持简洁并保留 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.promises
将提供对整个 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'));
您可以在下面找到我的方法:
首先,我需要 fs 作为 fsBase,然后我将“承诺”放入 fs 变量中。
const fsBase = require('fs');
const fs = fsBase.promises
const fn = async () => {
const data = await fs.readFile('example.txt', 'utf8');
console.log(data);
};
fn();
看这个例子
https://www.geeksforgeeks.org/node-js-fs-readfile-method/
// Include fs module
var fs = require('fs');
// Use fs.readFile() method to read the file
fs.readFile('demo.txt', (err, data) => {
console.log(data);
})
来自节点 v14.0.0
const {readFile} = require('fs/promises');
const myFunction = async()=>{
const result = await readFile('monolitic.txt','binary')
console.log(result)
}
myFunction()
const fs = require("fs");
const util = require("util");
const readFile = util.promisify(fs.readFile);
const getContent = async () => {
let my_content;
try {
const { toJSON } = await readFile("credentials.json");
my_content = toJSON();
console.log(my_content);
} catch (e) {
console.log("Error loading client secret file:", e);
}
};
我使用 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)
}
我不知道 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());
};
我知道,我可以使用 readFileSync
,但如果我这样做,我知道我永远无法理解 async
/await
,我将把这个问题埋葬。
目标:调用loadMonoCounter()
和return一个文件的内容。
每次调用 incrementMonoCounter()
(每次加载页面)时,该文件都会递增。该文件包含二进制缓冲区的转储并存储在 SSD 上。
无论我做什么,我都会在控制台中收到错误或 undefined
。
要使用 await
/async
,您需要 return 承诺的方法。如果没有像 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);
})
请注意,readFileSync
不接受回调,它 return 发送数据或抛出异常。你没有得到你想要的值,因为你提供的那个函数被忽略了,你没有捕获实际的 return 值。
自从 Node v11.0.0 fs promises 在没有 promisify
的情况下本机可用:
const fs = require('fs').promises;
async function loadMonoCounter() {
const data = await fs.readFile("monolitic.txt", "binary");
return Buffer.from(data);
}
这是@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);
}
您可以轻松地用这样的承诺包装 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");
您可以使用 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)
}
}
有一个fs.readFileSync( path, options )
方法,是同步的
为了保持简洁并保留 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.promises
将提供对整个 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'));
您可以在下面找到我的方法: 首先,我需要 fs 作为 fsBase,然后我将“承诺”放入 fs 变量中。
const fsBase = require('fs');
const fs = fsBase.promises
const fn = async () => {
const data = await fs.readFile('example.txt', 'utf8');
console.log(data);
};
fn();
看这个例子 https://www.geeksforgeeks.org/node-js-fs-readfile-method/
// Include fs module
var fs = require('fs');
// Use fs.readFile() method to read the file
fs.readFile('demo.txt', (err, data) => {
console.log(data);
})
来自节点 v14.0.0
const {readFile} = require('fs/promises');
const myFunction = async()=>{
const result = await readFile('monolitic.txt','binary')
console.log(result)
}
myFunction()
const fs = require("fs");
const util = require("util");
const readFile = util.promisify(fs.readFile);
const getContent = async () => {
let my_content;
try {
const { toJSON } = await readFile("credentials.json");
my_content = toJSON();
console.log(my_content);
} catch (e) {
console.log("Error loading client secret file:", e);
}
};
我使用 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)
}