#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] существует.