如何正确读取带有 async/await 的文件?

新手上路,请多包涵

我无法弄清楚 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 上。

无论我做什么,我都会在控制台中收到错误或 undefined

原文由 Jeremy Dicaire 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 704
2 个回答

要使用 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);

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 不接受回调,它返回数据或引发异常。你没有得到你想要的值,因为你提供的那个函数被忽略了,你没有捕获实际的返回值。

原文由 tadman 发布,翻译遵循 CC BY-SA 4.0 许可协议

由于 Node v11.0.0 fs 承诺在没有 promisify 的情况下本机可用:

 const fs = require('fs').promises;
async function loadMonoCounter() {
    const data = await fs.readFile("monolitic.txt", "binary");
    return Buffer.from(data);
}

原文由 Joel 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题