ytdl-core - 将视频标题存储在变量

时间:2017-09-28 04:21:56

标签: javascript node.js asynchronous discord

我的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时,顺便说一句,这也适用于我,但是#39;不是我想要的。 (事实上​​,它只适用于console.log,这是我基于我的异构函数的想法)

我希望将其实际存储在变量' queue'而不是将其记录到控制台中。如代码所示。我知道我需要一些东西来延迟其余的并让它等待ytdl函数完成然后继续执行剩下的代码,但我只是用完了选项。我尝试过回调,承诺和支持(但是直到那时我还不熟悉承诺和支持,所以我可能做错了,回调可能会变得混乱所以也许我也搞砸了)。我没有尝试超时,但我不认为他们在这种情况下真的很好,特别是考虑到这是一个可以处理来自多个服务器的命令的机器人。

有没有人知道我可以将ytdl.getInfo()中的信息存储在变量中?

1 个答案:

答案 0 :(得分:0)

我找到了一个使用async(需要节点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();