dmc1989
@dmc1989

Почему async.each не делает выполнение синхронным?

При следующем коде, функция проверки результата выполняется первой:
async.forEachOf(audios, function(audio, key, callback) {
    Audio.getMetadata(audio.path, function(err, metadata) { // асинхронная
        if (err) {
            console.log(err);
            return callback(err);
        }

        fullAudios.push(Audio.setMetadata(audio, metadata)); // return audio with metadata
        callback();
    });
}, function done(err) {
    if (err) {
        console.log(err);
    } 

    console.log(fullAudios);
});

Как можно проверить наличие всех файлов, а потом выдать массив из найдених, если функция проверки - асинхронная?
  • Вопрос задан
  • 335 просмотров
Решения вопроса 1
dmc1989
@dmc1989 Автор вопроса
И так, вот мое решение, не факт что код правильный, но зато работает.
module.exports.getMetadates = async function getMetadates(audios) {
    return await Promise.all(audios.filter((audio) => fs.existsSync(audio.path)).map(async function(audio) {
        let stream = fs.createReadStream(audio.path);
        let metadata = await getMetadataSync(stream);
    
        return Audio.setMetadata(audio, metadata);
    }));
}
async function getMetadataSync(file) {        
    return await new Promise ((resolve, reject) => {
        musicMetadataReader(file, (err, metadata) => {
             if (err) {
                 return reject(err);
             }
             if (metadata.picture.length > 0) {
                  metadata.picture[0].base64String = getDecodedPicture(metadata.picture[0]);
             }
             resolve(metadata); 
        });
    });
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
Negwereth
@Negwereth
lvivcss.com.ua
abyrkov
@abyrkov
JavaScripter
Только с помощью await
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы