0

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

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

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

4

1 回答 1

0

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

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

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

另外,删除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模块已经变得不那么有趣了。考虑使用 Promise。

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);
}); 
于 2019-03-17T13:39:03.743 回答