如何获取箭头函数作用域内的变量值并实现外部调用与存储
解决方法
首先在client.on('messageCreate')回调的外层声明用来存储link的数组:
// 外部存储数组,可根据需求修改命名 const savedLinks = []; client.on("messageCreate", async (msg) => { if (msg.content.startsWith("-p")) { if (!msg.member.voice?.channel) return msg.channel.send("Por favor..."); const connection = joinVoiceChannel({ channelId: msg.member.voice.channel.id, guildId: msg.guild.id, adapterCreator: msg.guild.voiceAdapterCreator, }); // 将.then链式调用改为await获取异步返回结果,保证执行顺序 const response = await google .youtube("v3") .search.list({ key: process.env.YOUTUBE_TOKEN, part: "id", q: msg.content.slice(3), maxResults: 1, }); const { data } = response; // items是返回的结果数组,maxResults=1时取下标0的元素 const link = "https://www.youtube.com/watch?v=" + data.items[0].id.videoId; // 将link存入外部数组 savedLinks.push(link); // 把link作为参数传入play.stream let stream = await play.stream(link); let resource = createAudioResource(stream.stream, { inputType: stream.type, }); let player = createAudioPlayer({ behaviors: { noSubscriber: NoSubscriberBehavior.Play, }, }); player.play(resource); connection.subscribe(player); } });
核心改动说明
- 原代码中
google.youtube.search.list是异步请求,.then回调的执行时机晚于后面的play.stream调用,无法同步拿到link值。因为外层回调已经声明了async,直接用await获取异步返回结果即可保证执行顺序符合预期。 - 修复了原代码中
data.items.id.videoId的写法错误,data.items是返回的结果数组,取第一条结果需要加[0]下标。 - 外部声明的数组作用域可覆盖到
client.on回调内部,直接调用数组方法就可以存储link值。
内容的提问来源于stack exchange,提问作者Cristian David Moraleda
相关产品推荐
相关产品推荐

