Javascript 如何找到异步数据的总和?

Javascript 如何找到异步数据的总和?,javascript,asynchronous,Javascript,Asynchronous,我正在尝试查找文件夹中所有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: ffprobeSta

我正在尝试查找文件夹中所有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;

我还没有彻底检查代码,但第一印象告诉我这是异步输出的问题。在稍后计算输出时,您正在同步使用console.log

因此,这就是您将输出视为0的原因。所有与求和相关的逻辑都应该在同一流程中实现

 sum+=file.streams[0].duration; 
 console.log(sum);// after this line
您只想调用console.logsum;在每个异步操作完成之后

因此,在处理文件时,请在下面列出已完成的异步操作总数fileprocessed,并将其与预期的异步操作总数进行比较,在本例中,异步操作总数与files.length相同,因为每个文件执行一个异步操作。如果比较显示这两个值相等,则表示所有作业都已完成,可以调用console.logsum;在那一点上编码

例如:

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);
}

看来你只是在给ffprobe打电话的时候出错了才把钱加进去…@fredrik:不,他不是。。。再看看。。。