ytdl-core - 将视频标题存储在变量中
Posted
技术标签:
【中文标题】ytdl-core - 将视频标题存储在变量中【英文标题】:ytdl-core - store video title in variable 【发布时间】:2018-03-09 17:05:56 【问题描述】:我的 Discord.js 机器人有以下内容,当执行命令 $music queue
时,它会在 Discord 频道中发送一条消息,其中包含要播放的下一个标题:
首先,我有一个循环,它遍历队列数组中的所有元素(它们都是 youtube 链接):
// Loop through each links and get their info.title with ytdl. Then, store it in queue.
conf.settings[server.id].queue.forEach((link, i) =>
ytdl.getInfo(link, function(err, info)
queue += `$i + 1. $info.title\n`;
);
);
message.channel.send(queue);
发送的消息很简单:
Music Queue:
什么时候应该发送:
Music Queue:
1. songTitle
2. songTitle
现在,我知道这与我认为 ytdl.getInfo() 是一个异步函数有关(但不完全确定)。我一直在许多网站上寻找有关这方面的信息,但在 ytdl 的回调函数中执行的代码产生结果的唯一情况是使用 console.log 时,顺便说一句,这也适用于我,但这不是我想要。 (它只适用于 console.log 的事实是我认为它是一个异步函数的原因)
我不想将其记录到控制台中,而是将其实际存储在变量“队列”中,如代码所示。我知道我需要一些东西来延迟其余部分并让它等待 ytdl 函数完成,然后继续执行其余代码,但我只是用完了选项。我尝试了回调、promise 和 gens(但在那之前我对 promises 和 gens 并不熟悉,所以我可能做错了,回调可能会变得混乱,所以也许我也搞砸了)。我没有尝试过超时,但我认为它们对于这种情况并不是一个很好的做法,特别是考虑到这是一个可以处理来自多个服务器的命令的机器人。
有谁知道我可以将来自 ytdl.getInfo() 的信息存储在变量中的方法吗?
【问题讨论】:
【参考方案1】:我发现了一个使用异步的解决方法(我认为需要节点 7.x),直到我发现它并更新了节点。
async function queue()
var queue = "Music Queue:\n"
var msg = await message.channel.send(`Fetching queue info...`);
for(var i = 0; i < conf.settings[server.id].queue.length; ++i)
const info = await ytdl.getInfo(conf.settings[server.id].queue[i]);
queue += `$i + 1. $info.title\n`;
msg.edit(queue);
queue();
【讨论】:
以上是关于ytdl-core - 将视频标题存储在变量中的主要内容,如果未能解决你的问题,请参考以下文章