Нужно проанализировать некоторые файлы XML из массива mass со значениями file_path.
Попробуйте использовать 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.info(Object.keys(result)[0]);
return result; //need get this result to results array
})
})
}
}, function(err, results) {
console.info(results)
});
Кто может понять, как это работает и что мне нужно изменить в моем коде. Большое спасибо!



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы пытаетесь сопоставить и отфильтровать одновременно. Поскольку ваше условие фильтра доступно синхронно, используйте для этого метод массива 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.info(Object.keys(result)[0]);
callback(null, result);
})
}, function(err, results) {
console.info(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.info(Object.keys(result)[0]);
resolve(result);
});
});
});
Promise.all(promises).then(results => {
console.info(results);
});
console.info(Object.keys(result)[0]); работает нормально. Но как я могу нажать result из синтаксического анализа в results массив функции фильтра/карты
Исправлена ошибка (asyc.filter должно быть async.map, а обратный вызов должен передавать нулевое значение) и добавлена версия Promise.
Это отлично работает с обещаниями! Мне действительно нужно изучить методы Promise! Большое спасибо @trinton!
к сожалению
resultsэтоundefined. Пытаюсь понять Promise API на вашем примере. Спасибо!