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)。要让此功能等待什么,可以在这里做什么?
答案 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或将回调函数传递给该函数。