Вы хотите вызывать console.log(sum);
только после завершения каждой асинхронной операции.
Таким образом, когда вы обрабатываете файлы, сохраняйте промежуточный итог того, сколько асинхронных операций было выполнено (filesProcessedSoFar
ниже), и сравните это с общим числом ожидаемых асинхронных операций (которое в этом случае будет таким же, как files.length
, так как вы выполняете одну асинхронную операцию для каждого файла).Если сравнение показывает, что эти два значения равны, вы знаете, что все задания завершены, и можете вызвать ваш код console.log(sum);
в этот момент.
Пример:
const fs = require('fs');
const ffprobe= require('ffprobe');
const ffprobeStatic = require('ffprobe-static');
let sum=0;
const files=fs.readdirSync('./');
// let's keep track of how many of the asynchronous jobs have finished, so we can call our printSum() function only when the last one finishes
let filesProcessedSoFar = 0;
files.forEach(file=>{
ffprobe(file,{ path: ffprobeStatic.path },(err,info)=>{
if(err) console.log(err);
sum+=file.streams[0].duration;
// if all files have been processed, it's time to print the sum
filesProcessedSoFar++;
if (filesProcessedSoFar == files.length) {
printSum();
}
});
function printSum() {
console.log(sum);
}