我可以等待 fs.readdir 但我不知道为啥

Posted

技术标签:

【中文标题】我可以等待 fs.readdir 但我不知道为啥【英文标题】:I can await fs.readdir but I don't know why我可以等待 fs.readdir 但我不知道为什么 【发布时间】:2019-10-16 16:30:32 【问题描述】:

https://github.com/SimulatedGREG/electron-vue

我用这个模板制作了electron。

我正在使用这个库。

https://www.npmjs.com/package/fs-extra

https://nodejs.org/docs/latest-v11.x/api/fs.html

通过这个文件,我可以这样写。

await fs.readdir

但是电子模板,它使用的是electron@2.0.4,它使用的是node@8.9.3。

所以我检查了这里。

https://nodejs.org/docs/latest-v8.x/api/fs.html

该函数似乎没有返回承诺。

但我实际上可以在 electron@2.0.4 中使用 fs-extra 等待 fs 函数。

开发和构建。

这是为什么?

结果

console.log(fs.readdir())

如下所示。

这是承诺。

但我不知道为什么我可以在 electron@2.0.4 中做到这一点。

【问题讨论】:

你想达到什么目的? await 可以替换 Promises 中的 .then()。你也可以这样使用它:fs.readdir().then((...args) => ....your handler). 我只是想知道为什么我可以在低于 node10 的情况下使用 awati fs-extra 功能。 fs-extra 承诺基本的 fs 功能,仅此而已。来自自述文件:“fs-extra 是原生 fs 的替代品。fs 中的所有方法都附加到 fs-extra。如果未通过回调,所有 fs 方法都会返回 Promise。” 是的!这是非常好的事情!我非常喜欢fs-extra!!!!太有用了。 【参考方案1】:

您可以在 node v8 中使用 fs 模块。返回值将传递给回调函数

const fs = require('fs');
fs.readdir(dir, function(err, list) 

// do your logic with list array

)

【讨论】:

谢谢,我知道。我只是想知道为什么节点 v8 上没有 fs/promise 但 fs-extra 函数返回 Promise。我认为这只是因为 fs-extra 是这样创建的。 是的,他们可能会为这个函数添加一个 promise 包装器。 这让我很困惑,因为在“fs-extra”节点 v10 中,fs.Dirent 类存在,而在“fs-extra”节点 v8 上 fs.Dirent 类不存在。这与“fs”相同。 Dirent 类存在于“fs”节点 v10 中,不存在于“fs”v8 中。所以,我认为“fs-extra”需要“fs”,“fs-extra”和“fs”几乎相同。我认为如果“fs”节点 v8 没有被承诺,“fs-extra”节点 v8 也不会被承诺。但是“fs-extra”节点 v8 功能被承诺了。我认为这是非常好的事情。我更喜欢 fs-extra。但我只是感到困惑,所以我问了这个问题。【参考方案2】:

如果您使用的是 Node > 8.16(我相信),您可以在 utils 模块中使用 promisify

const  promisify  = require('utils');
const fs = require('fs');
const readdir = promisify(fs.readdir);

(async () => 
  const res = await readdir('./path');
  console.log(res);
)();

【讨论】:

谢谢。但我想知道的是有点不同。如果可以,请查看上面与 Sharvin K 的对话。对不起。【参考方案3】:

对不起,我英语不好。

而且,我是一名初级网络开发人员。

这只是一个预期。

我看到了“fs-extra”的 package.json。

我在里面找不到“fs”。

它使用了一个名为“graceful-fs”的库,但这个库也不需要“fs”。

也许,“fs-extra”与“fs”无关。

它有自己的逻辑,即使在低于 version10 的节点中也已经承诺。

有人知道真相吗?

【讨论】:

以上是关于我可以等待 fs.readdir 但我不知道为啥的主要内容,如果未能解决你的问题,请参考以下文章

Node.js fs.readdir 递归目录搜索

Node.js fs.readdir 递归目录搜索

无法从 fs.readdir 获取 fs.Dirent 数组

将 `fs.readdir` 与 `.then` 链接以返回一个数组

使用 WPF MVVM 过滤数据网格,它可以工作,但我不知道为啥

bluebird - fs.readdir().then - 无法读取未定义的属性