You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取箭头函数作用域内的变量值并实现外部调用与存储

解决方法

首先在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 00:39:01