Как синхронизировать 2 асинхронизированные функции в NodeJS? - PullRequest
0 голосов
/ 10 января 2020

Я использую библиотеки из npm -модуля, называемые ytdl-core и ffmpeg для NodeJS У меня есть 2 функции из этих модулей, одна для загрузки видео, а другая для получения аудио из видео Youtube. Обе функции являются асинхронными, но в моем алгоритме одна зависит от другой. Сначала я хочу загрузить аудио, а после того, как я хочу получить видео источника аудио, и я не хочу выполнять обе асинхронизированные, я хочу синхронизированную операцию

Это мой код:

var stream = app.ytdl(req.body.linkYoutube,{quality: 18});
//First, download audio
app.ffmpeg(stream)
   .audioBitrate(128)
   .save(`${__dirname}/music.mp3`)
   .on('progress', (p) => {
      app.readline.cursorTo(process.stdout, 0);
      process.stdout.write(`${p.targetSize}kb downloaded`);
   })
   .on('end', () => {
   res.status(200).download('./controllers/music.mp3');
});

//Second, download video of that audio
app.ytdl(req.body.linkYoutube, { filter : (format) => 
   format.container === 'mp4' &&
   format.qualityLabel ==='720p'// &&
   //    format.itag === 18
   })
   .pipe(app.fs.createWriteStream('video.mp4'));

Я знаю, что это не хорошо, но это хорошее упражнение для изучения асинхронизма, спасибо!

1 Ответ

0 голосов
/ 10 января 2020

Вы можете использовать Promise для выполнения 2-й функции сразу после 1-го завершения, например:

  new Promise(resolve => {
    app.ffmpeg(stream)
      .audioBitrate(128)
      .save(`${__dirname}/music.mp3`)
      .on('progress', (p) => {
        app.readline.cursorTo(process.stdout, 0);
        process.stdout.write(`${p.targetSize}kb downloaded`);
      })
      .on('end', () => {
        res.status(200).download('./controllers/music.mp3');
        resolve();
      });
  }).then(() => {
    //Second, download video of that audio
    app.ytdl(req.body.linkYoutube, {
      filter: (format) =>
        format.container === 'mp4' &&
        format.qualityLabel === '720p'// &&
      //    format.itag === 18
    })
      .pipe(app.fs.createWriteStream('video.mp4'));

  }
  })
...