最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

在Promise中调用Node.js中的异步递归函数

运维笔记admin13浏览0评论

在Promise中调用Node.js中的异步递归函数

在Promise中调用Node.js中的异步递归函数

起初,我需要对电子和node.js说的很新。

我正在做的是尝试向我的浏览器发送带有一些目录数据的数组,并且此异步(错误:数组为空)。

问题应该是我的函数'scanDirectories(path)'。如果我将其设为非递归状态(scanDirectories(res)->仅返回res),则它对于1级目录而言效果很好,但对于递归目录则没有。

所以我认为我需要像上面的函数那样执行操作,并返回新的诺言?我尝试过,但是无法弄清楚它是如何工作的,或者我的语法应该是。

希望您能帮助我。西蒙

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);
  })
})

files.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);
}
回答如下:

您可以尝试使用类似的方法来生成承诺数组:

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);
}
发布评论

评论列表(0)

  1. 暂无评论