在 async.filter() 数组 nodejs 中获取异步结果

Get async result in async.filter() array nodejs

需要从具有 file_path 值的 mass 数组中解析一些 XML 文件。 尝试使用 asyncfsxml2js。 当使用单个字符串 file_path 时,一切都很完美。但是当我将 aync.filter() 与数组一起使用时,我无法理解如何从 xml.parseString()

return result
const fs = require('fs');
const xml2js = require('xml2js');
const async = require('async');

var mass=['/file1.xml','/fil2.xml','/file3.xml',...]

async.filter(mass, async function(file_path, callback){
    if(fs.statSync(file_path)['size']>0){
        fs.readFileSync(file_path, 'utf8', function(err, data) {        
            xml.parseString(data, function (err, result) {
               console.log(Object.keys(result)[0]);
               return result; //need get this result to results array
            })
        }) 
    }
}, function(err, results) {
    console.log(results)
});

谁能理解它是如何工作的以及我需要在我的代码中更改什么。 非常感谢!

您正在尝试同时映射和过滤。由于您的过滤条件是同步可用的,因此使用数组 filter 方法,然后将其传递给 async.map

然后您应该调用 async.map 提供给您的回调函数,将结果传递给它。所以不要 return 它,而是调用回调。

readFileSync 方法不像其异步方法那样采用回调。它只是 return 数据。

此外,删除 async 关键字,因为您根本没有使用 await 关键字。

async.map(mass.filter((file_path) => fs.statSync(file_path).size > 0), 
    function(file_path, callback){
        var data = fs.readFileSync(file_path, 'utf8');
        xml.parseString(data, function (err, result) {
           console.log(Object.keys(result)[0]);
           callback(null, result);
        }) 
    }, function(err, results) {
        console.log(results)
    }); 

然而,应该注意的是,由于 Node 现在带有 Promise API,甚至 async/await 扩展,async 模块变得不那么有趣了。考虑使用 Promises。

const promises = mass.filter(file_path => {
    return fs.statSync(file_path).size > 0
}).map(function(file_path) {
    return new Promise(resolve => {
        const data = fs.readFileSync(file_path, 'utf8');
        xml.parseString(data, function (err, result) {
            console.log(Object.keys(result)[0]);
            resolve(result);
        });
    }); 
});
Promise.all(promises).then(results => {
    console.log(results);
});