节点异步库 filterLimit 始终 returns 未定义

node async library filterLimit always returns undefined

我正在尝试将文件路径列表异步过滤为 return 仅存在的文件。我正在使用 async 库的 filterLimitfs-extra。功能如下:

const asyncFilter = require('async').filterLimit;
const fsExtra = require('fs-extra');

async function filterFiles(fileList){
  const existing = await asyncFilter(fileList, 5, (file, callback) => {
    console.log(file); // looks good

    fsExtra.pathExists(file, (err, exists) => {
       const result = err ? false : exists;
       console.log(result); // looks good (boolean)

       callback(null, result);
    });
  });

  console.log(existing); // always undefined...
}

编辑 2:下面的两个建议都不起作用...这是一个 工作版本 ,其中弃用的 fs.exists() 被替换为 fs.access()

const async = require('async');
const fs = require('fs');

async function filterFiles(fileList) {
    try {

        const result = await async.filterLimit(fileList, 5, function(filePath, callback) {
            fs.access(filePath, function(err) {
                callback(null, !err)
            });
        });

        console.log(result);
    } catch(err) {
        console.log(err);
    }
};

你不能简单地做:

不工作

    const asyncFilter = require('async').filterLimit;
    const fs = require('fs');

    async function filterFiles(fileList) {
        let result = [];
        await asyncFilter(fileList, 5, fs.exists, function(existing) {
            // array of existing files
            console.log(existing);
            // now assign the existing files to result array
            result = existing;
        });
        // should be the same as existing in callback function
        console.log(result);
    };

不需要 fs-extra。我认为你的问题是 async.filterLimit() 除了执行回调函数之外什么都不做 return,所以仅仅通过将 async.filterLimit() 分配给变量并不意味着你在那里得到结果,你会得到 undefined 因为函数没有 return 任何东西!

编辑:根据@Jaromanda X 的评论从上面改编的片段:

    const asyncFilter = require('async').filterLimit;
    const fs = require('fs');

    async function filterFiles(fileList) {
        let result = await asyncFilter(fileList, 5, fs.exists);
        // should contain only existing files
        console.log(result);
    };