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

Zagnieżdżanie obietnic a promise anti-pattern

42 Warsaw Coding Academy
+1 głos
178 wizyt
pytanie zadane 14 maja 2019 w JavaScript przez BT101 Stary wyjadacz (12,540 p.)
edycja 14 maja 2019 przez BT101

Pisze sobię własny crawler w nodeJS z użyciem puppeteera. Program mi się rozrósł i mam dosyć sporą ilość obietnic, przyjmijmy, że mam 200 różnych promisów robiących różne rzeczy. Połowa z nich jest returnowana przez funkcje z API puppeteera a połowa jest moich własnych. 

Żeby ułożyć to w jakieś logiczne moduły aby całość była łatwa w utrzymaniu zacząłem zagnieżdżać promisy z użyciem syntaxu async/await.

Dla przykładu mam moduł, który crawluje aplikacje internetową i jest to 1 promise, w nim wywołuje 10 "child" promisów które wywołują 4-5 funkcji puppeteera, które również zwracają promise. Więc podsumowując ten 1 moduł ma pod sobą gdzieś z 50 obietnic i jest OK jakoś tam działa i robi co trzeba.

Problemy zaczynają się robić gdy chcę obsługiwać błędy z try/catch. Weźmy taki przykładowy kod

const grandchildPromise = () => {
  return new Promise((resolve, reject) => {
      throw 'some error msg';
      //tutaj wywołanie jakiejś funkcji puppeteera
  });
};

const childPromise = () => {
  return new Promise(async(resolve, reject) => {
    try {
      await grandchildPromise();
    } catch(e) {
      console.log('caught in childPromise');
      reject(e);
    }
  });
};

const parentPromise = () => {
  return new Promise(async(resolve, reject) => {
    try {
      await childPromise();
    } catch(e) {
      console.log('caught in parentPromise');
      reject(e);
    }
  });
}

parentPromise()
  .then(() => {
    console.log('fullfilled')
  })
  .catch(e => console.log(e));

Problemem jest, że przekazuje asynchroniczną funkcje jako executor do new Promise. Jest to anti-pattern i przez to nie wszystkie błędy z funkcji `granchildPromise` będą poprawnie złapane.

Jednak taka struktura zagnieżdżania mi najbardziej pasuje, próbowałem robić chainy z `then` i było to dla mnie dużo mniej wygodne więc nie bardzo chcę zmieniać samej architektury tego lecz muszę to zrefaktoryzować aby łapało mi wszystkie błędy a nie tylko część.

A więc moje pytanie - jak zrefaktoryzować ten kod aby zachować zagnieżdżone obietnice, zachować async/await lecz nie przekazywać async do new Promise żeby poprawnie łapało błędy?

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
1 odpowiedź 143 wizyt
pytanie zadane 24 grudnia 2022 w JavaScript przez rafaeru Początkujący (330 p.)
+1 głos
1 odpowiedź 255 wizyt
0 głosów
1 odpowiedź 210 wizyt
pytanie zadane 18 listopada 2019 w JavaScript przez Krzysztofson Użytkownik (620 p.)

93,382 zapytań

142,382 odpowiedzi

322,539 komentarzy

62,738 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
...