我的Discord.js机器人有以下内容,在执行命令$music 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函数的完成,然后继续执行剩下的代码,但是我只是没有选择了。我尝试了回调、承诺和氏族(但在那之前我还不熟悉承诺和氏族,所以我可能做错了,回调可能会变得混乱,所以我可能也搞砸了)。我还没有尝试过超时,但我认为这种情况并不是很好的实践,特别是考虑到这是一个处理来自多台服务器的命令的机器人。
有人知道我如何将ytdl.getInfo()中的信息存储在变量中吗?
发布于 2017-09-29 16:23:23
我发现了一个使用异步(我认为需要节点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();https://stackoverflow.com/questions/46460931
复制相似问题