如何在下一个功能开始之前等待功能完成?

时间:2020-03-05 16:29:38

标签: node.js async-await discord.js

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");
  });
};

我得到的输出是:

在function1中找不到结果

在function3中找到结果

ytdl.getInfo是用于获取youtube视频的URL并返回带有json对象以及有关该视频的信息的回调的函数。 从这段代码中,我需要将结果返回到function1,然后继续前进,因此我猜想使用await是最好的选择,但是await无法正常工作(我猜是因为它确实返回了promise)。要让此功能等待什么,可以在这里做什么?

2 个答案:

答案 0 :(得分:1)

在最终参数上使用通用模式(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 */ });

答案 1 :(得分:1)

您正在等待一个非异步功能。

查看此函数声明。

exports.function2 = () => {

现在看看您的使用方式。

const result = await this.function2();

您看到问题了吗?如果不这样做,则说明您正在对非异步功能使用await,或者换句话说,您不是在等待功能完成。为了解决此问题,您需要执行以下操作:

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现在返回一个Promise。您可以像上面提到的那样使用promisify,但是如果您不想这样做,则需要将ytdl调用包装在promise中。在回调内部返回不会从父函数返回;最好使用promise或将回调函数传递给该函数。

相关问题