javascript - 如何防止 NodeJS 中的异步 - 等待任务 a 完成后再启动任务 b

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

我需要等待任务 A 完成后再执行任务 B 代码。

任务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

上面的代码部分从上传文件夹中获取文件,将其转换为新的文件格式并将其保存到下载目录中。

您可以在下面看到我正在尝试访问下载文件夹中的文件(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');

最佳答案

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

关于javascript - 如何防止 NodeJS 中的异步 - 等待任务 a 完成后再启动任务 b,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46345497/

相关文章:

javascript - 使用 formdata 通过 jquery ajax 将带有文件输入、文本输入和多个复选框的表单发布到 php

javascript - 如何使用 JavaScript 在 HTML 中为特定单词添加样式?

node.js - Stripe 将支付方式添加到试用订阅,然后验证信用卡

node.js - 我该如何解决 npm 错误! js错误:0909006C:PEM in Node.?

iphone - Objective C 是否足够快用于 DSP/音频编程

javascript - 悬停列表项时更改 div 的背景图像

javascript - 带有凭据的 Webpack-dev-server CORS 错误

node.js - 通过 electron 的主进程访问渲染器进程 cookie

audio - Concat 2 视频保留音频时间戳并在单个 ffmpeg 命令中添加覆盖(水印)

javascript - 加载多个音频文件,即使互联网连接不佳也可以同时播放