我可以等待 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 但我不知道为啥的主要内容,如果未能解决你的问题,请参考以下文章
无法从 fs.readdir 获取 fs.Dirent 数组
将 `fs.readdir` 与 `.then` 链接以返回一个数组