【发布时间】:2018-12-13 07:15:51
【问题描述】:
在文档中,它显示了 readdir 和 stat 的两个版本。两者都有异步和同步版本readir/readdirSync 和stat/statSync。
因为readidir 和stat 是异步的,我希望它们返回一个Promise,但是当尝试使用async/await 时,脚本不会等待readdir 解决,如果我使用.then/.catch,我会收到错误消息cannot read .then of undefined.
我在这里要做的只是将运行脚本的目录中存在的目录映射到dirsOfCurrentDir 映射。
返回错误cannot read .then of undefined
const fs = require('fs');
const directory = `${ __dirname }/${ process.argv[2] }`;
const dirsOfCurrentDir = new Map();
fs.readdir(directory, (err, files) => {
let path;
if (err)
return console.log(err);
files.forEach(file => {
path = directory + file;
fs.stat(path, (err, stats) => {
if (err)
return console.log(err);
dirsOfCurrentDir.set(file, directory);
});
});
}).then(() => console.log('adasdasd'))
console.log(dirsOfCurrentDir)
返回Map {}
const foo = async () => {
await fs.readdir(directory, (err, files) => {
let path;
if (err)
return console.log(err);
files.forEach(file => {
path = directory + file;
fs.stat(path, (err, stats) => {
if (err)
return console.log(err);
dirsOfCurrentDir.set(file, directory);
});
});
});
};
foo()
console.log(dirsOfCurrentDir)
编辑
我最终选择了 readdirSync 和 statSync 这两个函数的同步版本。虽然使用 async 方法或 promisify 会感觉更好,但我仍然没有弄清楚如何让我的代码正常工作。
const fs = require('fs');
const directory = `${ __dirname }/${ process.argv[2] }`;
const dirsOfCurrentDir = new Map();
const dirContents = fs.readdirSync(directory);
dirContents.forEach(file => {
const path = directory + file;
const stats = fs.statSync(path);
if (stats.isDirectory())
dirsOfCurrentDir.set(file, path);
});
console.log(dirsOfCurrentDir); // logs out the map with all properties set
【问题讨论】:
-
readdir的callback参数是您将传递给.then的函数。如文档所示,它不会返回 Promise -
stackoverflow.com/questions/44019316/… 或许你应该看看这个
-
@BrandonBenefield 它没有明确说它不返回任何东西,但它返回了它会明确表示的东西(例如“返回一个承诺”)。既然它没有这么说,那么你不能假设它返回一个承诺
-
嗯,在堆栈溢出时,您不应该将您的答案添加到您的问题中。问题是为了问题。答案是为了答案。两者不应混用。如果您想为自己的问题添加自己的答案,您可以这样做。请从您的问题中删除您的解决方案。它不属于那里。
-
如果这是服务器端代码,那么在启动时以外的任何地方使用任何同步 I/O 都会对您的服务器可伸缩性造成灾难性影响。它实际上扼杀了可扩展性。
标签: node.js asynchronous promise fs