узел.Функция JS Twitch bot fetch выполняет работу, но возвращает неопределенное значение

#javascript #node.js

Вопрос:

Поэтому я просматривал другие потоки, было похоже, что использование return должно давать значение родительской функции. Но мой код ниже всегда возвращает неопределенное значение.

У меня такое чувство, что это из-за времени написания кода. (синхронизация и асинхронность что-то что-то, все еще читаю об этом)

Поэтому мой вопрос в том, может ли кто-нибудь из вас увидеть, что происходит не так, и не могли бы вы подтолкнуть меня в правильном направлении (или прямо дать мне ответ со ссылками на документацию).

Спасибо!

 const tmi = require("tmi.js");
const fetch = require("node-fetch");
const doubleCommand = message.toLowerCase().split(" ");

// This function calls the code to be executed
if (doubleCommand[0] === "!shoutout" || doubleCommand[0] === "!so") {
    console.log(isUser(doubleCommand[1], channel));
  }

//This funktion checks to see if doubleCommand[1] is a existing user
function isUser(userLookUp, channel) {
  fetch(
    `https://api.twitch.tv/helix/users?login=${userLookUp.toLowerCase().trim()}`,
    {
      method: "GET",
      headers: {
        Authorization: `Bearer ${O_Token}`,
        "Client-Id": C_ID
      }
    }
  )
    .then(res => res.json())
    .then(res => {
      if (res.data !== "undefined") { // Here i check to see if there was a user and if there was i check what game they are/were playing.
        fetch(
          `https://api.twitch.tv/helix/channels?broadcaster_id=${res.data[0].id}`,
          {
            method: "GET",
            headers: {
              Authorization: `Bearer ${O_Token}`,
              "Client-Id": C_ID
            }
          }
        )
          .then(result => result.json())
          .then(result => {
            return res.data[0].game_name
          });
      } else {
      }
    });
}
 

Ответ №1:

Я думаю, что преобразование вашего кода в async/await шаблон сделает его более читабельным и поможет вам отследить проблему. Конечно, вы всегда можете поместить некоторые console.log инструкции в свой код (и, вероятно, узнать, что он возвращается до завершения всех операций).

Код будет исходить из чего-то вроде

 function doStuffThen() {
    fetch(...).then(res => {
        fetch(...).then(res => {
            fetch(...).then(res => {
                // etc etc
            });
        });
    });
}
 

К чему-то вроде

 async function doStuffAsync() {
    let data1 = await fetch(...);
    let data2 = await fetch(...);
    let data3 = await fetch(...);
    return someResu<
}
 

В конце концов, я не уверен, в чем именно заключается проблема, но я бы определенно рекомендовал перейти к асинхронности/ожиданию и отладке оттуда.

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

1. Спасибо, когда я сделал это с помощью let data1, я получил сообщение об ошибке об ожидании и синхронизации. Я посмотрю, смогу ли я продублировать его и поделиться им с вами

2. Одна вещь, которую следует отметить, заключается в том, что ваш вызов isUser будет разрешен только через некоторое время, поэтому вы не можете сделать это немедленно console.log . Вы await также можете выбрать его или использовать then для печати после его разрешения.

3. Спасибо @fravolt ! Я изменил код на этот формат, и теперь он работает. К сожалению, мой ответ занял так много времени, так как у меня let data1 = await fetch(Data[0].smth) вместо let data1 = await fetch(data[0].smth) этого были, и это приводило к ошибкам, так как .Data[0] не существует, в то время как .data[0] существует.