【问题标题】:ytdl-core - store video title in variableytdl-core - 将视频标题存储在变量中
【发布时间】: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() 的信息存储在变量中的方法吗?

【问题讨论】:

    标签: javascript node.js asynchronous discord


    【解决方案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();
    

    【讨论】:

      猜你喜欢
      • 2016-12-13
      • 2018-05-29
      • 2020-05-05
      • 2019-09-23
      • 1970-01-01
      • 1970-01-01
      • 2021-08-03
      • 2011-05-31
      • 2021-03-18
      相关资源
      最近更新 更多