【问题标题】:Error on dir.close() after async iterator over fs.Dir created by fs.opendir()fs.opendir() 创建的 fs.Dir 上的异步迭代器后 dir.close() 出错
【发布时间】:2020-12-29 13:19:09
【问题描述】:

2021 年更新: 歧义已在 nodejs doc 中的 April 2021 commit

中得到修复

编辑:这本质上是节点文档的问题。见讨论here


我正在尝试自节点 v12.12 以来添加的 fs.Dir 类:

// hello-world.js
const fs = require('fs');

(async function () {
  const dir = await fs.promises.opendir(__dirname);
  for await (const dirent of dir) {
    console.log('name:', dirent.name, 'isDir:', dirent.isDirectory());
  }
  return dir.close();
})();

$ node hello-world.js

它似乎按预期工作,它会注销目录中每个文件的信息(没有丢失一个),但最后它会抛出(node:3218) UnhandledPromiseRejectionWarning: Error [ERR_DIR_CLOSED]: Directory handle was closed at Dir.close (internal/fs/dir.js:161:13)。我做错了什么?

【问题讨论】:

    标签: node.js


    【解决方案1】:

    dir 对象的异步迭代器将在迭代完成时自动关闭 dir。这似乎没有记录在案,但您可以在代码 here 中看到。

    async* entries() {
        try {
          while (true) {
            const result = await this[kDirReadPromisified]();
            if (result === null) {
              break;
            }
            yield result;
          }
        } finally {
          await this[kDirClosePromisified]();
        }
      }
    }
    
    ObjectDefineProperty(Dir.prototype, SymbolAsyncIterator, {
      value: Dir.prototype.entries,
      enumerable: false,
      writable: true,
      configurable: true,
    });
    

    【讨论】:

    • 是的@jfriend00,非常感谢您为我挖掘源代码!我认为应该更好地记录这种神奇的行为,所以我在他们的 github 上提交了一个问题。到目前为止,没有人回应(10天后)。当他们更新时,我会回来更新!
    猜你喜欢
    • 2014-02-04
    • 2018-12-08
    • 1970-01-01
    • 2014-06-11
    • 1970-01-01
    • 2017-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多