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

时间:2019-03-17 13:15:35

标签: javascript node.js asynchronous fs xml2js

需要使用mass值来解析file_path数组中的一些XML文件。 尝试使用asyncfsxml2js。 当使用单个字符串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)
});

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

1 个答案:

答案 0 :(得分: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模块也变得不那么有趣了。考虑使用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);
});