在 node 中使用文件系统.js并执行异步/等待自节点 11 起对异步等待 fs 函数的本机支持

2022-08-30 01:18:51

我想对一些文件系统操作使用异步/等待。通常 async/await 工作正常,因为我使用 .babel-plugin-syntax-async-functions

但是有了这个代码,我遇到了 if 的情况,其中是未定义的:names

import fs from 'fs';

async function myF() {
  let names;
  try {
    names = await fs.readdir('path/to/dir');
  } catch (e) {
    console.log('e', e);
  }
  if (names === undefined) {
    console.log('undefined');
  } else {
    console.log('First Name', names[0]);
  }
}

myF();

当我将代码重建到回调地狱版本中时,一切都很好,我得到了文件名。感谢您的提示。


答案 1

自节点 11 起对异步等待 fs 函数的本机支持

由于 Node.JS 11.0.0(稳定版)和版本 10.0.0(实验版),因此您可以访问已经 promisify'd 的文件系统方法,并且可以将它们与异常处理一起使用,而不是检查回调的返回值是否包含错误。try catch

API非常干净优雅!只需使用对象的成员:.promisesfs

import fs from 'fs';
const fsPromises = fs.promises;

async function listDir() {
  try {
    return await fsPromises.readdir('path/to/dir');
  } catch (err) {
    console.error('Error occured while reading directory!', err);
  }
}

listDir();

答案 2

从节点 8.0.0 开始,您可以使用以下命令:

const fs = require('fs');
const util = require('util');

const readdir = util.promisify(fs.readdir);

async function myF() {
  let names;
  try {
    names = await readdir('path/to/dir');
  } catch (err) {
    console.log(err);
  }
  if (names === undefined) {
    console.log('undefined');
  } else {
    console.log('First Name', names[0]);
  }
}

myF();

查看 https://nodejs.org/dist/latest-v8.x/docs/api/util.html#util_util_promisify_original