我想在一些文件系统操作中使用async/await。通常async/await工作正常,因为我使用babel-plugin-syntax-async-functions。

但在这段代码中,我遇到了name未定义的if情况:

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();

当我将代码重建为回调地狱版本时,一切都OK,我得到了文件名。 谢谢你的提示。


当前回答

节点v14.0.0及以上版本

你可以这样做:

import { readdir } from "fs/promises";

就像从fs导入一样

更多细节请参见此PR: https://github.com/nodejs/node/pull/31553

其他回答

节点v14.0.0及以上版本

你可以这样做:

import { readdir } from "fs/promises";

就像从fs导入一样

更多细节请参见此PR: https://github.com/nodejs/node/pull/31553

这是这个问题的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);
}

从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

以下是对我有效的方法:

const fsp = require('fs-promise');

(async () => {
  try {
    const names = await fsp.readdir('path/to/dir');
    console.log(names[0]);
  } catch (e) {
    console.log('error: ', e);
  }
})();

当和谐标志被启用时,这段代码可以在没有babel的节点7.6中工作:从节点7.7开始,您甚至不需要这个标志!

开头包含的fsp库只是fs(和fs-ext)的约定包装器。

这些天你可以在没有babel的节点上做什么,我真的很兴奋!原生异步/await使编写代码变得如此愉快!

UPDATE 2017-06: fs-promise模块已弃用。使用fs-extra代替相同的API。

您可以使用简单而轻量级的模块https://github.com/nacholibre/nwc-l,它同时支持异步和同步方法。

注:这个模块是我自己创建的。