ytdl-core - 将视频标题存储在变量中
ytdl-core - store video title in variable
我的 Discord.js 机器人有以下内容,当执行命令 $music queue
时,它会在 Discord 频道中发送一条消息,其中包含下一个要播放的标题:
首先,我有一个循环,循环遍历 queue 数组中的所有元素(它们都是 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 的事实是我认为它是一个异步函数的基础)
我不想将其记录到控制台,而是想将其实际存储在变量 'queue' 中,如代码所示。我知道我需要一些东西来延迟其余部分并让它等待 ytdl 函数完成,然后继续执行其余代码,但我只是 运行 没有选择。我尝试了回调、promises 和 gens(但直到那时我才熟悉 promises 和 gens,所以我可能做错了,回调可能会变得混乱,所以也许我也搞砸了)。我没有尝试过超时,但我认为它们对于这种情况并不是真正的好做法,尤其是考虑到这是一个将处理来自多个服务器的命令的机器人。
有谁知道我可以将来自 ytdl.getInfo() 的信息存储在变量中的方法吗?
我找到了使用异步的解决方法(我认为需要节点 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();
我的 Discord.js 机器人有以下内容,当执行命令 $music queue
时,它会在 Discord 频道中发送一条消息,其中包含下一个要播放的标题:
首先,我有一个循环,循环遍历 queue 数组中的所有元素(它们都是 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 的事实是我认为它是一个异步函数的基础)
我不想将其记录到控制台,而是想将其实际存储在变量 'queue' 中,如代码所示。我知道我需要一些东西来延迟其余部分并让它等待 ytdl 函数完成,然后继续执行其余代码,但我只是 运行 没有选择。我尝试了回调、promises 和 gens(但直到那时我才熟悉 promises 和 gens,所以我可能做错了,回调可能会变得混乱,所以也许我也搞砸了)。我没有尝试过超时,但我认为它们对于这种情况并不是真正的好做法,尤其是考虑到这是一个将处理来自多个服务器的命令的机器人。
有谁知道我可以将来自 ytdl.getInfo() 的信息存储在变量中的方法吗?
我找到了使用异步的解决方法(我认为需要节点 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();