Analiza: Oddzwonienia a obietnice

Ludzie, zanim zagłębicie się w swoje szare komórki w wyżej wymieniony zmodyfikowany tekst z Call Me Maybe (Carly Rae Jepsen) :), pozwólcie nam pogódź się z faktem, że ten artykuł jest pod każdym względem artykułem analitycznym pozwalającym zrozumieć asynchroniczne podejście Javascript!

Jeśli jednak chcesz w tajemnicy napełnić uszy melodyjnym numerem, zostawiam link tutaj: https://www.youtube.com/watch?v=fWNaR-rxAic

Podejście asynchroniczne i Javascript (JS)narodziły się ręka w rękę. Wynika to całkowicie ze struktury projektowej JS, która wymusza na nim łączenie się ze światem narzędzi asynchronicznych. Ponieważ w JS istnieje tylko jeden wątek wykonawczy, dostosowanie się do podejścia synchronicznego powoduje powstanie dużej ilości czasu bezczynności wykonania, który można efektywnie wykorzystać do wykonywania innych zadań [podstawowe podejście asynchroniczne ]

Poniższy rysunek może pomóc w zrozumieniu tego pomysłu: Pamiętaj, że oś X to przyrost czasu, a oś Y to zdarzenia -›

Teraz pytanie brzmi: jak osiągnąć asynchronizację! Przedstawię dwóch konkurentów, którzy dzielnie stoczyli bitwę asynchroniczną, a mianowicie Oddzwonienia i Obietnice!

Cześć, nazywam się PD:) i próbuję umówić się na randkę z dziewczyną z sąsiedztwa, Bee [jej pseudonim]. W desperackiej próbie ustalenia daty wybieram jej numer z odrobiną nadziei! Odbiera telefon, a ja waham się, czy ją zaprosić. Z wielkim niepokojem pytam ją, a ona odpowiada „Aaaa..PD.. Dam znać w ciągu godziny”. Biorę to sobie do serca i nadal wykonuję codzienne czynności, takie jak kąpiel, jazda do biura, jedzenie śniadania… Chcę powiedzieć, że jej odpowiedź nie powstrzymuje mnie od wykonywania innych niezbędnych czynności, które muszę ZROBIĆ! Później, za godzinę, poznam jej odpowiedź! Ta historia ma ścisły związek z CALLBACKamiw JavaScript.

Wywołanie zwrotne to podejście, w którym wątek zasadniczo nie czeka na zakończenie zdarzenia! Jeśli wystąpi zdarzenie wymagające dużej ilości czasu, wątek będzie kontynuował wykonywanie wszystkich zdarzeń i przekaże wykonanie zdarzenia wymagającego dużej ilości czasu do wywołania zwrotnego. Cel wywołania zwrotnego jest celowo obsługiwany przez pierwszorzędną funkcję [wątek roboczy], wykonuje ona czasochłonne zdarzenie, a po zakończeniu zdarzenia powiadamia główny wątek o statusie. Proszę postępować zgodnie z przykładem:

Kod:

Konsola:

Wyjaśnienie:

Pierwsze dwa rezultaty to wykonywanie codziennych czynności, podczas gdy nadal oczekuję od niej odpowiedzi TAK/NIE. Zatem funkcja ReplyFromBee jest w zasadzie wywołaniem zwrotnym, zajmuje się odpowiedzią uroczej pani i zawsze, gdy jest ona gotowa udzielić mi odpowiedzi, funkcja się tym zajmuje! [W tym przypadku użyłem funkcji setTimeout do emulacji warunku i dałem mu czas oczekiwania 4000 milisekund]. W ten sposób ustanawia się dojrzałość asynchroniczną!

A teraz wracamy do oryginalnej historii. [PD] przygotowuję się do randki, ale mam dylemat. Czy powie TAK, czy będzie to NIE? Jednakże, aby pochwalić się swoim statusem wśród znajomych, nadal robię szum i przygotowuję się na Randkę, na wypadek gdyby powiedziała TAK. W zależności od jej odpowiedzi, musiałbym zarezerwować stolik, wypożyczyć smoking i odbierz ją moim AUDI. [chociaż w rzeczywistości nie mam żadnego]. Uffffff!!

Jeśli przeanalizujemy powyższą sytuację, okaże się, że moją prośbę o Datę można podzielić na trzy prawdopodobne scenariusze:

  • Oczekuje:Taki jest teraz mój status!
  • Rozwiązane:Ona mówi TAK, a ja dostaję DATĘ :) :) :) :)
  • Odrzucono::( :( :( :`( :(

Obietnicew języku JavaScript są obietnicami w prawdziwym życiu. Beeobiecała, że ​​udzieli odpowiedzi w określonym terminie, a ja mam trzy możliwe scenariusze [stwierdza oficjalnie]. W zależności od jej odpowiedzi mogę podjąć dalsze kroki, ani przed, ani po. Zagłębmy się w kod obietnicy:

Kod:

Wyjaśnienie kodu:

Funkcja willIGetADate [twórca obietnicy] wykorzystuje konstruktor obietnic JS, który uwzględnia dwa argumenty, a mianowicie rozwiąż i odrzuć. W zależności od wartości zmiennej logicznej BeeResponse podejmujemy kolejne działania i przekazujemy wynik w parametrach „Resolve” lub „Reject”. Z drugiej strony funkcja askBee jest konsumentem obietnicy, tj. wykorzystuje obietnicę willIGetADate i generuje możliwy wynik. Proszę zwrócić uwagę na użycie .then i .catch, które działają na metodę tworzenia Promise i przekazują wartość spełniony. Ale jaka jest wartość spełnienia? spełnionawartość to dokładnie ta wartość, którą przekazujesz w swojej obietnicy resolve(your_success_value). Dlatego w naszym przypadku będzie to dataobiekt. Podobnie w części .catch error.message to nic innego jak wartość, którą przekazujemy w reject(your_fail_value). Będzie to zatem powódw naszym przypadku. Zweryfikujmy wynik.

Wyjście konsoli:

Podstawową różnicą między obydwoma, z których każdy służy temu samemu celowi, jest ich możliwość składania, co w zasadzie oznacza, że ​​łączenie wielu obietnic [łańcuch obietnic] działa, ale łączenie wielu wywołań zwrotnych powoduje bałagan w kodzie [callback hell ] Nawet z punktu widzenia czytelności Obietnice wyglądają zwięźle, przejrzyście i wyróżniają się na tle wywołań zwrotnych.

Pamiętaj, że można śmiało powiedzieć, że obietnice to tylko cukier syntaktyczny. Wszystko, co możesz zrobić z obietnicami, możesz zrobić z wywołaniami zwrotnymi.

Dobrze wiedzieć, że w bloku pojawił się nowy dzieciak o nazwie Observables,, który zmniejsza wysiłek związany z wprowadzeniem współbieżności w aplikacji poprzez wymuszenie rejestracji aplikacji w strumieniu zdarzeń. Porozmawiam o tym na następnym spotkaniu.

Do tego czasu pozwól mi spędzić czas z Bee! Miłego kodowania... :)