我无法弄清楚 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()并返回文件内容。
每次调用 incrementMonoCounter()(每个页面加载)时,该文件都会递增。该文件包含二进制缓冲区的转储,并存储在SSD中。
不管我做什么,我在控制台中收到错误或未定义。
答案 0 :(得分:99)
要使用await
/ async
,您需要返回承诺的方法。没有像promisify
这样的包装器,核心API函数不会这样做:
const fs = require('fs');
const util = require('util');
// Convert fs.readFile into Promise version of same
const readFile = util.promisify(fs.readFile);
async function getStuff() {
return await 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
不接受回调,它返回数据或抛出异常。您没有获得所需的值,因为您提供的功能被忽略,而您没有捕获实际的返回值。
答案 1 :(得分:13)
您可以使用{v1.0.0自Node v11.0.0起提供的本地版本的.footer-content nav a {
margin: 100px;
color: yellow;
text-decoration: underline;
}
<footer>
<div class="footer-content">
<h3>Sweet Eats Bakery</h3>
<nav>
<a href="#">About</a>
<a href="#">Cookies</a>
<a href="#">Weddings</a>
<a href="#">Catering</a>
<a href="#">Contact</a>
</nav>
<p class="copyright">© Sweet Eats 2018</p>
</div>
</footer>
答案 2 :(得分:6)
您可以像这样用promise轻松包装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");
答案 3 :(得分:5)
这是@Joel答案的打字稿版本。在节点11.0之后可用:
import { promises as fs } from 'fs';
async function loadMonoCounter() {
const data = await fs.readFile('monolitic.txt', 'binary');
return Buffer.from(data);
}
答案 4 :(得分:4)
因为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);
}
答案 5 :(得分:4)
为使其简洁并保留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'));
答案 6 :(得分:4)
来自节点 v14.0.0
const {readFile} = require('fs/promises');
const myFunction = async()=>{
const result = await readFile('monolitic.txt','binary')
console.log(result)
}
myFunction()
答案 7 :(得分:2)
有一个fs.readFileSync( path, options )
方法,它是同步的。
答案 8 :(得分:0)
您可以在下面找到我的方法: 首先,我需要 fs 作为 fsBase,然后我将“promises”放入 fs 变量中。
const fsBase = require('fs');
const fs = fsBase.promises
const fn = async () => {
const data = await fs.readFile('example.txt', 'utf8');
console.log(data);
};
fn();
答案 9 :(得分:-1)
看这个例子 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);
})