如何防止NodeJS中的异步 - 在启动任务b之前等待任务a完成

时间:2017-09-21 13:38:55

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

我需要在执行任务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');

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

使用异步水落包,用于序列化该功能,以便第二个功能首先运行 这是链接package link