• 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?

42 Warsaw Coding Academy
+1 głos
342 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 (607,060 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 (607,060 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 (607,060 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 (607,060 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ź 210 wizyt
pytanie zadane 18 listopada 2019 w JavaScript przez Krzysztofson Użytkownik (620 p.)
+1 głos
0 odpowiedzi 178 wizyt
pytanie zadane 14 maja 2019 w JavaScript przez BT101 Stary wyjadacz (12,540 p.)
0 głosów
1 odpowiedź 438 wizyt

93,382 zapytań

142,382 odpowiedzi

322,539 komentarzy

62,740 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

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...