Как ждать функцию fini sh, прежде чем начинать со следующей функции? - PullRequest
1 голос
/ 05 марта 2020
const ytdl = require("ytdl-core");
exports.function1 = async () => {
  const result = await this.function2();
  if (!result) return console.log("result not found in function1");
};
exports.function2 = () => {
  return this.function3();
};
exports.function3 = () => {
  ytdl.getInfo(/*URL For any Youtube video*/, (error, result) => {
    if (error) return console.log(error);

    return info && console.log("found result in function3");
  });
};

Вывод, который я получаю:

результат не найден в функции1

результат найден в функции3

ytdl.getInfo - это функция, которая берет URL для видео на YouTube и возвращает обратный вызов с json объектом с информацией об этом видео. Из этого кода мне нужно вернуть результат в function1, прежде чем двигаться вперед, поэтому я предполагаю, что использование await - лучший вариант, но ожидание не работает (я предполагаю, потому что оно возвращает обещание). что можно сделать здесь, чтобы заставить эту функцию ждать?

Ответы [ 2 ]

1 голос
/ 06 марта 2020

Вы ожидаете функцию, которая не является асинхронной c.

Посмотрите на это объявление функции.

exports.function2 = () => {

Теперь посмотрим, как вы его используете.

const result = await this.function2();

Вы видите проблему? Если вы этого не сделаете, вы используете await для функции, которая не является асинхронной, или, другими словами, вы не ждете, пока функция завершит работу sh. Чтобы решить эту проблему, вам нужно сделать следующее:

const ytdl = require("ytdl-core");

exports.function1 = async () => {
  const result = await this.function2();
  if (!result) return console.log("result not found in function1");
};

exports.function2 = async () => {
  return this.function3();
};

exports.function3 = () => {
  return new Promise((resolve, reject) => {
      ytdl.getInfo(/*URL For any Youtube video*/, (error, result) => {
        if (error) return reject(error);

        resolve(info && console.log("found result in function3"));
      });
  });

};

Кроме того, обратите внимание, что функция 3 теперь возвращает обещание. Вы можете использовать обещание, как кто-то, упомянутый выше, но если вы не хотите этого, вам нужно заключить вызов ytdl в обещание. Возврат внутри функции обратного вызова не возвращается из родительской функции; Лучше всего использовать обещание или передать функцию обратного вызова в функцию.

1 голос
/ 05 марта 2020

Функции обратного вызова, которые используют общий шаблон (error, value) => {} в своем последнем аргументе, могут быть обещаны.

const util = require('util');

затем

const pgetInfo = util.promisify(ytdl.getInfo);
let result = await pgetInfo(/*URL For any Youtube video*/);

или

const pgetInfo = util.promisify(ytdl.getInfo);
pgetInfo(/*URL For any Youtube video*/)
    .then((result) => { /* result stuff */ })
    .catch((err) => { /* err stuff */ });
...