Вы пытаетесь отобразить и отфильтровать одновременно.Поскольку условие фильтра доступно синхронно, используйте для этого метод массива 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
стал гораздо менее интересным.Рассмотрите возможность использования обещаний.
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);
});