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();