Node.js 如何在开始下一个函数之前等待函数完成?

Node.js 如何在开始下一个函数之前等待函数完成?,node.js,async-await,discord.js,Node.js,Async Await,Discord.js,我得到的输出是: 在函数1中找不到结果 在函数3中找到结果 getInfo是一个函数,它获取youtube视频的URL,并返回一个包含该视频信息的json对象回调。 从这段代码中,我需要在继续之前将结果返回到function1,所以我猜使用wait是最好的选择,但wait不起作用(我猜是因为它确实返回承诺)。这里可以做些什么来让这个函数等待呢?可以建议使用它的最后一个参数上的公共模式(错误,值)=>{}的回调函数 const ytdl = require("ytdl-core"

我得到的输出是:

在函数1中找不到结果

在函数3中找到结果

getInfo是一个函数,它获取youtube视频的URL,并返回一个包含该视频信息的json对象回调。
从这段代码中,我需要在继续之前将结果返回到function1,所以我猜使用wait是最好的选择,但wait不起作用(我猜是因为它确实返回承诺)。这里可以做些什么来让这个函数等待呢?

可以建议使用它的最后一个参数上的公共模式
(错误,值)=>{}
的回调函数

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

然后

const pgetInfo=util.promisify(ytdl.getInfo);
let result=等待pgetInfo(/*任何Youtube视频的URL*/);

const pgetInfo=util.promisify(ytdl.getInfo);
pgetInfo(/*任何Youtube视频的URL*/)
.then((结果)=>{/*结果*/})
.catch((err)=>{/*err stuff*/});

您正在等待一个非异步函数

看看这个函数声明

const util = require('util');
现在看看你是如何使用它的

exports.function2 = () => {
你看到问题了吗?如果您不这样做,那么您正在对一个非异步函数使用wait,或者换句话说,您不是在等待函数完成。要解决此问题,您需要执行以下操作:

const result = await this.function2();

此外,请注意,函数3现在返回一个承诺。您可以像上面提到的人一样使用promisify,但如果您不想这样做,则需要将ytdl调用封装在承诺中。在回调函数内部返回不会从父函数返回;最好使用承诺或将回调函数传递到函数中。

您需要更清楚地了解您试图完成的内容和代码没有完成的内容。你的标题应该是一个简短的解释,在你的问题主体中,你需要对此进行扩展。为了补充这一点,我鼓励你使用更具描述性的函数名,但这显然不会改变功能。谢谢你的回答。它成功了,结果我的承诺真的很糟糕。经过几次尝试,我的代码运行得很好。谢谢你的解决方案,但我还没有使用它。但我以后会查出来的。不过这个方法看起来很简单。
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"));
      });
  });

};