首先我需要说我对 Electron 和 Node.js 还很陌生。
我正在做的是尝试将包含一些目录数据的数组发送到我的浏览器并且这是异步的(错误:数组为空)。
问题应该是我的函数“scanDirectories(path)”。 如果我将其设置为非递归(scanDirectories(res) -> 仅返回 res),它对于 1 级目录来说效果很好,但递归则不然。
所以我认为我需要像上面的函数一样返回一个新的 promise ? 我尝试过,但无法弄清楚它是如何工作的或我的语法应该是什么。
希望你能帮助我。
西蒙
main.js:
从 ipcmain 调用函数
ipcMain.on('fileTree', (event, arg) => {
let fileDirectory = helperFile.getDirectories(arg);
fileDirectory.then(function(result) {
event.reply('fileTree', result);
}, function(err) {
console.log(err);
})
})
文件.js
const { readdir } = require('fs').promises;
const resolvePath = require('path').resolve;
module.exports = {
getDirectories: async function(path) {
return new Promise(function (resolve, reject) {
try {
resolve(scanDirectories(path));
} catch {
reject('Error');
}
});
}
};
async function scanDirectories(path) {
const dirents = await readdir(path, {withFileTypes: true});
const files = dirents.map((dirent) => {
const res = resolvePath(path, dirent.name);
return dirent.isDirectory() ? scanDirectories(res) : res;
});
return Array.prototype.concat(...files);
}
最佳答案
您可以尝试这样的方法,生成一系列 promise :
files.js
const { readdir } = require('fs').promises;
const resolvePath = require('path').resolve;
module.exports = {
// This is an async function so don’t need internal promise
getDirectories: async function(path) {
try {
const dirs = await scanDirectories(path);
return dirs;
}
catch {
throw new Error('Error');
}
}
};
async function scanDirectories(path) {
const dirents = await readdir(path, {withFileTypes: true});
// Generate array of promises
const promises = dirents.map(dirent => {
const res = resolvePath(path, dirent.name);
return dirent.isDirectory()
? scanDirectories(res)
: Promise.resolve(res);
});
// Await all promises
const files = await Promise.all(promises);
return Array.prototype.concat(...files);
}
关于node.js - 使用 Promise 调用 Node.js 中的异步递归函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58362012/