Как вывести значение переменной из области действия функции стрелки, которая ее создала

#javascript #node.js #discord.js #bots

Вопрос:

Итак, у меня есть этот код:

 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,
    });
    google
      .youtube("v3")
      .search.list({
        key: process.env.YOUTUBE_TOKEN,
        part: "id",
        q: msg.content.slice(3),
        maxResults: 1,
      })
      .then((response) => {
        const { data } = response;
        let link = "https://www.youtube.com/watch?v="   data.items.id.videoId;
      });
    let args = msg.content.slice(3);
    let stream = await play.stream(args);
    let resource = createAudioResource(stream.stream, {
      inputType: stream.type,
    });
    let player = createAudioPlayer({
      behaviors: {
        noSubscriber: NoSubscriberBehavior.Play,
      },
    });
    player.play(resource);
    connection.subscribe(player);
  }
});
 

И я хотел бы использовать значение переменной «link», которая является строкой, в качестве параметра для метода play.stre(args)

Я не совсем понимаю, как это сделать

Кроме того, если возможно, я хотел бы найти способ сохранить это значение также внутри массива за пределами всего:

 *client.on('messageCreate' , async msg => {...   ...})*
 

Ответ №1:

Вы, скорее всего, захотите позвонить play.stream из then обратного вызова list :

 google.youtube("v3")
  .search.list({
    key: process.env.YOUTUBE_TOKEN,
    part: "id",
    q: msg.content.slice(3),
    maxResults: 1,
  })
  .then(async (response) => {
    const { data } = response;
    let link = "https://www.youtube.com/watch?v="   data.items.id.videoId;
    let stream = await play.stream(link);
  });
 

Таким образом, вы убедитесь, что у вас действительно задано значение link при использовании его для вызова stream .

Комментарии:

1. Делая это, я получаю еще одну ошибку «Синтаксическая ошибка: ожидание допустимо только в асинхронных функциях и телах модулей верхнего уровня».

2. Это просто потому then , что обратный вызов не был асинхронным. Я добавил async ключевое слово сейчас, но это просто быстрое решение. Я бы рекомендовал провести рефакторинг в использовании async/await в целом, это позволит вам многое очистить.

3. @CristianDavidMoraleda Я бы также предложил уделить минуту, чтобы почитать об асинхронности/ожидании . Это может сбивать с толку, но важно, чтобы вы полностью это понимали, иначе вам будет очень больно пытаться это сделать

4. После помещения «play.stream» в тогдашний обратный вызов списка метод createAudioResource() теперь говорит, что переменная «поток» не определена

5. Вам нужно будет адаптировать остальную часть вашего кода. Я не пытаюсь переработать ваш код для вас, но чтобы дать вам представление о концепции.