• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Problem ze zwracaniem wartości z if-a

Object Storage Arubacloud
+1 głos
273 wizyt
pytanie zadane 4 września 2021 w JavaScript przez Maxxxii Obywatel (1,260 p.)

Cześć, 

Mam problem ponieważ kiedy chcę aby if zwracał jakąś wartość to i tak później tej wartości nie widać(np. wpisując console.log nic się nie wypisuje). Poniżej kod:

console.log(windSpeed);
  console.log(vrbOrvisibility);
  if(vrbOrvisibility.search("0V") != -1){
    const vrb = vrbOrvisibility.substr(0,7);
    console.log(vrb);
    console.log(actAirport);
    console.log(obsTime);
    const windTxt = `Wind: ${windDirect}(${vrb}) deegres at ${windSpeed}`
    console.log(windTxt)
    return vrb;
  }
  else if(vrbOrvisibility.search("0V") == -1){
    const visibility = vrbOrvisibility.substr(0,5);
    console.log(visibility);
    return visibility;
  }
  
  client.login(config.token);
})();

Pozdrawiam

1 odpowiedź

+2 głosów
odpowiedź 4 września 2021 przez ScriptyChris Mędrzec (190,190 p.)

Ten kod jest w jakiejś funkcji? Jeśli tak, to pokaż jej całość. Jeśli to jest asynchroniczne IIFE z poprzedniego tematu, to - jak już wspominałem w podlinkowanym komentarzu - zwracanie stąd wartości jest mało sensowne i próba obsługi tego bez top-level await skomplikuje kod.

Napisz, co konkretnie chcesz zrobić i pokaż więcej kodu.

komentarz 4 września 2021 przez Maxxxii Obywatel (1,260 p.)
(async () => {
const {Client, Intents, MessageEmbed} = require("discord.js");
const client = new Client({ intents: [Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES]});
const config = require("./config.json");
const fetch = require("node-fetch"); 

  let result = await fetch('http://metar.vatsim.net/metar.php?id=daug')
    .then(res => res.text())
    .then(text => {
      console.log(text);
      return text;
    })
     
  console.log(result);
  const date = new Date();
  const year = date.getUTCFullYear();
  const month = date.getUTCMonth();
  console.log(year);
  console.log(month);
  const airport = result.substr(0,4);
  const time = result.substr(5,7);
  const day = time.substr(0,2);
  const hour = time.substr(2,2);
  const minute = time.substr(4,2);
  const wind = result.substr(13,8);
  const windDirect = wind.substr(0,3);
  const windSpeed = wind.substr(3,5);
  const vrbOrvisibility = result.substr(21,8);
  console.log(airport);
  console.log(time);
  console.log(day);
  console.log(hour);
  console.log(minute);
  console.log(time.lenght);
  const actAirport = (`Airport: ${airport}`); 
  const obsTime = (`Time of observation: ${year}-${month}-${day} ${hour}:${minute}Z`);
  console.log(actAirport);
  console.log(obsTime);
  console.log(wind);
  if(windDirect == "VRB"){
    console.log("Variable");
  }
  else{
    console.log(windDirect);
  }
  console.log(windSpeed);
  console.log(vrbOrvisibility);
  if(vrbOrvisibility.search("0V") != -1){
    const vrb = vrbOrvisibility.substr(0,7);
    console.log(vrb);
    console.log(actAirport);
    console.log(obsTime);
    const windTxt = `Wind: ${windDirect}(${vrb}) deegres at ${windSpeed}`
    console.log(windTxt)
    return vrb;
  }
  else if(vrbOrvisibility.search("0V") == -1){
    const visibility = vrbOrvisibility.substr(0,5);
    console.log(visibility);
    return visibility;
  }
  
  client.login(config.token);
})();

Tak wygląda cały kod. Chciałbym po prostu móc używać vrb i visibility w reszcie kodu poza if-em

komentarz 4 września 2021 przez ScriptyChris Mędrzec (190,190 p.)

Podziel sobie ten kod na funkcje. Niech ten async IIFE będzie główną funkcją, w której wołasz pozostałe - te z kolei wydziel na zewnątrz, nawet do osobnych modułów. Returny, które masz teraz powodują zwrócenie wartości na zewnątrz IIFE, ale pod postacią promisa (bo to funkcja asynchroniczna). Musiałbyś więc, albo ją awaitować (znowu wracamy do kwestii top-level await albo owijania funkcji w funkcje, co będzie trochę przypominać callback-hell), albo użyć na niej then i zrobić łańcuszek promisów.

Proponuję Ci pisać kod w ten deseń:

const {Client, Intents, MessageEmbed} = require("discord.js");
const client = new Client({ intents: [Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES]});
const config = require("./config.json");
const fetch = require("node-fetch"); 

(async () => { 
  let result = await getPageContent();      
  console.log(result);

  const date = new Date();
  const year = date.getUTCFullYear();
  const month = date.getUTCMonth();
  console.log(year);
  console.log(month);
  const airport = result.substr(0,4);
  const time = result.substr(5,7);
  const day = time.substr(0,2);
  const hour = time.substr(2,2);
  const minute = time.substr(4,2);
  const wind = result.substr(13,8);
  const windDirect = wind.substr(0,3);
  const windSpeed = wind.substr(3,5);
  const vrbOrvisibility = result.substr(21,8);
  console.log(airport);
  console.log(time);
  console.log(day);
  console.log(hour);
  console.log(minute);
  console.log(time.lenght);
  const actAirport = (`Airport: ${airport}`); 
  const obsTime = (`Time of observation: ${year}-${month}-${day} ${hour}:${minute}Z`);
  console.log(actAirport);
  console.log(obsTime);
  console.log(wind);
 
  const calculatedWindDirect = calculateWindDirect(windDirect);
  console.log(windSpeed);
  console.log(vrbOrvisibility);

  const calculatedVrbOrVisibility = calculateVrbOrVisibility(vrbOrVisibility);
   
  client.login(config.token);
})();

function getPageContent() {
  return fetch('http://metar.vatsim.net/metar.php?id=daug')
    .then(res => res.text())
    .then(text => {
      console.log(text);
      return text;
    })
}

function calculateWindDirect(windDirect) {
  if(windDirect == "VRB"){
    console.log("Variable");
  }
  else{
    console.log(windDirect);
  }
}

function calculateVrbOrVisibility(vrbOrVisibility) {
    if(vrbOrvisibility.search("0V") != -1){
    const vrb = vrbOrvisibility.substr(0,7);
    console.log(vrb);
    console.log(actAirport);
    console.log(obsTime);
    const windTxt = `Wind: ${windDirect}(${vrb}) deegres at ${windSpeed}`
    console.log(windTxt)
    return vrb;
  }
  else if(vrbOrvisibility.search("0V") == -1){
    const visibility = vrbOrvisibility.substr(0,5);
    console.log(visibility);
    return visibility;
  }
}

Napisałem to w ciemno, bez uruchamiania, więc traktuj to bardziej jako schemat - te luźne zmienne (typu airport, time, windDirect) też wydziel do osobnych funkcji - mnie się nie chciało analizować do czego one służą żeby je odpowiednio wydzielić. Podziel sobie wnętrze IIFE na mniejsze funkcje i je możesz nawet przenieść do osobnych modułów (które sobie require'uj), dzięki temu w głównej funkcji będzie tylko główny kod, a szczegóły implementacyjne będą w osobnych miejscach.

komentarz 4 września 2021 przez Maxxxii Obywatel (1,260 p.)
Dzięki wielkie!

Podobne pytania

0 głosów
1 odpowiedź 917 wizyt
–1 głos
1 odpowiedź 229 wizyt
pytanie zadane 29 sierpnia 2017 w C i C++ przez Shiro Stary wyjadacz (10,300 p.)
0 głosów
2 odpowiedzi 736 wizyt
pytanie zadane 11 września 2015 w PHP przez Else Stary wyjadacz (12,260 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...