需要使用mass
值来解析file_path
数组中的一些XML文件。
尝试使用async
,fs
,xml2js
。
当使用单个字符串file_path
时,所有效果都很好。但是当我将aync.filter()
与数组一起使用时,我无法理解如何从return result
到xml.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)
});
谁可以了解它的工作原理以及我需要在代码中进行哪些更改。 非常感谢!
答案 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);
});