Функция разрешения () возвращает неопределенное в обещании - PullRequest
0 голосов
/ 23 декабря 2018

Я конвертирую пакет youtube-dl npm, чтобы иметь обещание вместо обратных вызовов, поэтому у меня есть рабочая функция, но она не разрешает функцию разрешения. Я что-то здесь упустил?Моя функция загрузки YouTube выглядит следующим образом:

const fs = require('fs');
const youtubedl = require('youtube-dl');


const downloadVideoAsync = (url) => {
    const video = youtubedl(url,['--format=18'],{ cwd: __dirname }); 
     if( video !== null) {
         video.on('info', function(info) {
             console.log('Download started');
             console.log('filename: ' + info._filename);
             console.log('size: ' + info.size);
             const videoName = info.fulltitle.replace(/\s+/g, '-').toLowerCase();
             if(videoName) {

                 return new Promise((resolve, reject) =>{
                     video.pipe(fs.createWriteStream(`videos/${videoName}.mp4`));
                     video.on('end', function() {
                        console.log(`this is the videoName in async ${videoName}`);
                        resolve(true);
                     })



                 });
             }

         });
     }

}

module.exports.downloadVideoAsync = downloadVideoAsync;

И я вызываю эту функцию в основном файле server.js следующим образом:

 const asdf = async () => {
      const result = await downloadVideoAsync('https://www.youtube.com/watch?v=EsceiAe1B6w');
      console.log(`this is the result ${result}`);
  }

  asdf();

1 Ответ

0 голосов
/ 23 декабря 2018

Возвращает undefined, потому что это то, что возвращает downloadVideoAsync.

  console.log(
      typeof downloadVideoAsync('https://www.youtube.com/watch?v=EsceiAe1B6w')
  ); // undefined

Чтобы ваш код работал так, как вы хотите, вы должны обернуть video.on('info' Обещанием.

const downloadVideoAsync = (url) => {

    return new Promise((resolve, reject) => {

        const video = youtubedl(url,['--format=18'],{ cwd: __dirname }); 
        if(!video)
            return reject(new Error('Video is empty...'));

         video.on('error', reject);

         video.on('info', function(info) {
             console.log('Download started');
             console.log('filename: ' + info._filename);
             console.log('size: ' + info.size);
             const videoName = info.fulltitle.replace(/\s+/g, '-').toLowerCase();
             if(!videoName)
                  return reject(new Error('Empty name'));

             video.pipe(fs.createWriteStream(`videos/${videoName}.mp4`));
             video.on('end', function() {
                  console.log(`this is the videoName in async ${videoName}`);
                  resolve(true);
             });


         });

    });
}

Теперь downloadVideoAsync возвращает Promise вместо undefined и будет ждать, пока не будет вызван end, перед разрешением или отклонит, если видео пустое.

...