Как найти сумму асинхронных данных? - PullRequest
0 голосов
/ 06 июня 2018

Я пытаюсь найти общую длительность всех файлов mp4 в папке.но я не могу найти сумму.

 const fs = require('fs');
const ffprobe= require('ffprobe');
const ffprobeStatic = require('ffprobe-static');
let sum=0;
const files=fs.readdirSync('./');
files.forEach(file=>{
    ffprobe(file,{ path: ffprobeStatic.path },(err,info)=>{
      if(err) console.log(err);
      sum+=file.streams[0].duration;
   });


console.log(sum)// 0;

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Вы хотите вызывать 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);
}
0 голосов
/ 06 июня 2018

Я не проверил код полностью, но первое впечатление говорит мне, что это проблема асинхронного вывода.Вы используете console.log() синхронно, в то время как ваш выход рассчитывается позже.

Поэтому вы видите вывод как 0. Вся ваша логика, связанная с sum, должна быть реализована в одном потоке .ie

 sum+=file.streams[0].duration; 
 console.log(sum);// after this line
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...