【问题标题】:how to prevent Async in NodeJS - wait for task a to complete before starting task b如何防止NodeJS中的异步-在启动任务b之前等待任务a完成
【发布时间】:2017-09-21 13:38:54
【问题描述】:

在执行任务B代码之前,我需要等待任务A完成。

任务A是转换音频文件和

任务 B 使用转换后的音频进行进一步处理。

因为任务 A 将新的音频文件存储到特定目录,而任务 B 正在尝试访问不存在的文件,我的代码中断了。

如何确保新音频文件保存到目录后任务 B 代码执行?

代码

var track = fileURL;//your path to source file

  ffmpeg(track)
  .toFormat('flac')
  .on('error', function (err) {
      console.log('An error occurred: ' + err.message);
  })
  .on('progress', function (progress) {
      // console.log(JSON.stringify(progress));
      console.log('Processing: ' + progress.targetSize + ' KB converted');
  })
  .on('end', function () {
      console.log('Processing finished !');
  })
  .save(path.join(__dirname, '/public/downloads/Test.flac'));//path where you want to save your file

以上部分代码从uploads文件夹中取出文件,将其转换为新的文件格式,并保存到downloads目录中。

您可以在下面看到我正在尝试访问下载文件夹中的文件(Test.flac)。还有很多代码,但我需要在完成上述任务后执行这段代码。

  const Speech = require('@google-cloud/speech');
  const projectId = 'uliq-68823';
  // Instantiates a client
  const speechClient = Speech({
   projectId: projectId
  });

  // The name of the audio file to transcribe

  const fileName2 = path.join(__dirname, '/public/downloads/' + 'Test.flac');

  // Reads a local audio file and converts it to base64
  const file2 = fs.readFileSync(fileName2);
  const audioBytes = file2.toString('base64');

【问题讨论】:

    标签: javascript node.js audio google-speech-api


    【解决方案1】:

    fluent-ffmpeg 库使用流来处理您的文件。因此,如果您想在流完成后执行代码,请在流的'end' 事件上调用的回调中调用您的代码。

    例子:

    var track = fileURL;//your path to source file
    
    ffmpeg(track)
    .toFormat('flac')
    .on('error', function (err) {
          console.log('An error occurred: ' + err.message);
    })
    .on('progress', function (progress) {
          // console.log(JSON.stringify(progress));
          console.log('Processing: ' + progress.targetSize + ' KB converted');
    })
    .on('end', function () {
          console.log('Processing finished !');
          // USE THE FILE HERE
          // <----------------
    })
    .save(path.join(__dirname, '/public/downloads/Test.flac'));
    

    【讨论】:

    • 所以现在文件被保存到下载文件夹但函数(错误,结果){}中的代码似乎没有执行,并且在终端中我看到光标无休止地等待。文件参数持有什么?
    • 如果我不使用回调,我会得到:TypeError: ffmpeg(...).toFormat(...).on(...).on(...).on(.. .).save(...).then 不是函数
    • 什么是 ffmpeg ?哪个节点包?
    • 我的错,这是一个不同的库。我检查了文档,在你的库中,它是一个流,所以在.on('end', function(){}) 中调用你的代码。我会更新我的答案
    【解决方案2】:

    使用用于序列化函数的异步瀑布包,以便第二个函数在第一个函数之后运行 这是链接package link

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-16
      • 2016-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多