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

Jak poradzić sobie z asynchronicznością w przypadku tworzenia nowego obiektu klasy?

Object Storage Arubacloud
+1 głos
204 wizyt
pytanie zadane 24 sierpnia 2018 w JavaScript przez CP733 Początkujący (390 p.)

Witajcie, mój problem polega na tym, że gdy zainicjuję wykonanie się instrukcji, to najpierw próbuje ona się odwołać do metody w klasie, jednak wyskakuje błąd, bo obiekt z klasą nie został jeszcze utworzony.

 

client.on('message', async message => {
		let args = message.content.split(/ +/);
		switch (args[0]) {
      
			case '/cmd':
              
              const singleCounter = await new singleCounterCommand();
              singleCounter.getGroupEarnings(groupName, message, countOfEmployees);
              break;
        }
});

 

Takie użycie async/await nie przynosi oczekiwanego rezultatu, nadal wyskakuje błąd spowodowany rzekomym brakiem metody getGroupEarning(), ona jednak istnieje w tym obiekcie, który tworzy się niestety nieco później. Jeżeli dam na uruchamianie tej metody setTimetout z odpowiednim czasem to oczywiście wszystko działa, ale takie rozwiązanie odpada, bo jest dość nieprzewidywalne.

1 odpowiedź

0 głosów
odpowiedź 24 sierpnia 2018 przez Comandeer Guru (601,110 p.)

Czy konstruktor singleCounterCommand zwraca Promise? Jeśli nie, to await nic nie da. Jeśli ten obiekt dostaje metody później, to zamiast konstruktora zrobiłbym fabrykę, która zwracałaby Promise rozwiązywany dopiero w chwili, gdy te metody się pojawią.

Inna rzecz, że dość dziwny jest przypadek obiektu z opóźnionym dodawaniem metod. Zastanowiłbym się, czy nie dałoby się tego przeprojektować.

komentarz 24 sierpnia 2018 przez CP733 Początkujący (390 p.)
Jestem dość nieogarnięty w tym języku, więc nie za bardzo wiem jak te obietnice działają dokładnie. Jeżeli chodzi o samą klasę, to jest konstruktor, który przetwarza dane z zewnętrznej strony i zapisuje w tablicy, następnie wykonuje on inną metodę, ta metoda przetwarza kolejne dane ze strony i zapisuje w tablicy, a następnie uruchamia kolejną metodę, która też przetwarza dane ze strony i zapisuje. Żądania do tych stron obsługuje w moim przypadku axios. Jeżeli mógłbyś rozwinąć swoje myśli, byłbym bardzo wdzięczny.
komentarz 24 sierpnia 2018 przez Comandeer Guru (601,110 p.)
Jak dla mnie najpierw powinieneś poodpalać te wszystkie metody i dopiero na samym końcu zwrócić obiekt.
komentarz 24 sierpnia 2018 przez CP733 Początkujący (390 p.)
Gdy tworze obiekt, wtedy rusza ten cały konstruktor i uruchamia kolejne metody, i dopiero wtedy mogę ich używać, nie rozumiem co masz na myśli.
komentarz 24 sierpnia 2018 przez Comandeer Guru (601,110 p.)
No właśnie o to. Konstruktor by zamiast obiektu zwracał Promise, a w tle by leciały te wszystkie czynności.
komentarz 24 sierpnia 2018 przez CP733 Początkujący (390 p.)

Tylko, że 

singleCounter.getGroupEarnings(groupName, message, countOfEmployees);

potrzebuje już tamtych klas przerobionych, bo tamte ustawiają dane, a ta je jakby przetwarza i wyświetla.

komentarz 24 sierpnia 2018 przez Comandeer Guru (601,110 p.)
edycja 24 sierpnia 2018 przez Comandeer

No 5 raz się nie powtórzę :D

To jest po prostu źle zaprojektowane i IMO wypadałoby to w całości przerobić.

Jak mówiłem, zamieniłbym konstruktor na fabrykę:

const singleCounter = await getSingleCounterCommand();

Ona sama powinna wyglądać jakoś tak:

function getSingleCounterCommand() {
	return Promise.all( [
		axiosRequest1,
		axiosRequest2
	] ).then( ( results ) => {
		return new SingleCounterCommand( ...results );
	} );
}

 

Podobne pytania

0 głosów
1 odpowiedź 162 wizyt
pytanie zadane 18 listopada 2019 w JavaScript przez Krzysztofson Użytkownik (620 p.)
+1 głos
0 odpowiedzi 146 wizyt
pytanie zadane 14 maja 2019 w JavaScript przez BT101 Stary wyjadacz (12,540 p.)
0 głosów
1 odpowiedź 204 wizyt

92,568 zapytań

141,424 odpowiedzi

319,632 komentarzy

61,956 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!

...