• 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

VPS Starter Arubacloud
+1 głos
142 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ź 84 wizyt
pytanie zadane 24 grudnia 2022 w JavaScript przez rafaeru Początkujący (330 p.)
+1 głos
1 odpowiedź 174 wizyt
0 głosów
1 odpowiedź 158 wizyt
pytanie zadane 18 listopada 2019 w JavaScript przez Krzysztofson Użytkownik (620 p.)

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...