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

Konkurs Mistrz Programowania
+1 głos
453 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,540 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,540 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,540 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,540 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ź 270 wizyt
pytanie zadane 18 listopada 2019 w JavaScript przez Krzysztofson Użytkownik (620 p.)
+1 głos
0 odpowiedzi 229 wizyt
pytanie zadane 14 maja 2019 w JavaScript przez BT101 Stary wyjadacz (12,540 p.)
0 głosów
1 odpowiedź 573 wizyt

93,657 zapytań

142,577 odpowiedzi

323,101 komentarzy

63,175 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

Kursy INF.02 i INF.03
...