Получить асинхронный результат в массиве async.filter() nodejs

Нужно проанализировать некоторые файлы 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)
});

Кто может понять, как это работает и что мне нужно изменить в моем коде. Большое спасибо!

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
305
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

к сожалению results это undefined. Пытаюсь понять Promise API на вашем примере. Спасибо!

Dan Mishin 17.03.2019 15:23
console.info(Object.keys(result)[0]); работает нормально. Но как я могу нажать result из синтаксического анализа в results массив функции фильтра/карты
Dan Mishin 17.03.2019 15:27

Исправлена ​​ошибка (asyc.filter должно быть async.map, а обратный вызов должен передавать нулевое значение) и добавлена ​​версия Promise.

trincot 17.03.2019 15:56

Это отлично работает с обещаниями! Мне действительно нужно изучить методы Promise! Большое спасибо @trinton!

Dan Mishin 17.03.2019 16:20

Другие вопросы по теме