node.js - 使用 Promise 调用 Node.js 中的异步递归函数

标签 node.js asynchronous promise callback electron

首先我需要说我对 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/

相关文章:

python - 我可以异步执行 "apply"中的函数到 pandas 数据帧吗?

javascript - BluebirdJS promise jQuery 无法正常工作

javascript - 在 node.js 中的 for 循环后完成多个 writeFile 函数时解决 promise

javascript - 使用 Nunjucks 模板循环整数值

java - 如何等待 JavaRx2 Flowable 完成所有任务?

node.js - 检测 socket.io emit 是否不起作用

python - 如何从同步例程通知异步例程?

javascript - AngularJS 的链式 promise

node.js - Node 中密码存储的密码学最佳实践

node.js - 我们的时间追踪器如何绕过 MacOS 辅助功能设置?