W poprzednich samouczkach można było zobaczyć funkcje wywołania zwrotnego, które są używane w przypadku zdarzeń asynchronicznych. Ale czasami funkcje zwrotne mogą stać się koszmarem, gdy zaczynają się zagnieżdżać, a program zaczyna być długi i złożony.
W tym samouczku nauczysz się:
- Co to są obietnice?
- Odwołania do obietnic
- Radzenie sobie z zagnieżdżonymi obietnicami
- Tworzenie niestandardowej obietnicy
Co to są obietnice?
Zanim zaczniemy od obietnic, przyjrzyjmy się najpierw, czym są funkcje „wywołania zwrotnego” w Node.js. Wiele razy widzieliśmy te funkcje wywołania zwrotnego w poprzednich rozdziałach, więc przejrzyjmy szybko jeden z nich.
Poniższy przykład przedstawia fragment kodu, który służy do łączenia się z bazą danych MongoDB i wykonywania operacji aktualizacji na jednym z rekordów w bazie danych.
-
W powyższym kodzie część funkcji (err, db) jest znana jako deklaracja funkcji anonimowej lub funkcji zwrotnej. Gdy MongoClient utworzy połączenie z bazą danych MongoDB, powróci do funkcji wywołania zwrotnego po zakończeniu operacji połączenia. W pewnym sensie operacje połączenia odbywają się w tle, a po zakończeniu wywołuje naszą funkcję zwrotną. Pamiętaj, że jest to jeden z kluczowych punktów Node.js, aby umożliwić jednoczesne wykonywanie wielu operacji, a tym samym nie blokować żadnego użytkownika przed wykonaniem operacji.
-
Drugi blok kodu jest tym, co jest wykonywane, gdy faktycznie wywoływana jest funkcja zwrotna. Funkcja wywołania zwrotnego aktualizuje tylko jeden rekord w naszej bazie danych MongoDB.
Więc czym jest obietnica? Cóż, obietnica to tylko ulepszenie funkcji wywołań zwrotnych w Node.js. W trakcie cyklu rozwojowego może zaistnieć potrzeba zagnieżdżenia wielu funkcji zwrotnych razem. W pewnym momencie może to stać się trochę niechlujne i trudne do utrzymania. Krótko mówiąc, obietnica to ulepszenie wywołań zwrotnych, które ma na celu złagodzenie tych problemów.
Podstawową składnię obietnicy przedstawiono poniżej;
var promise = doSomethingAync()promise.then(onFulfilled, onRejected)
- „doSomethingAync” to dowolne wywołanie zwrotne lub funkcja asynchroniczna, która wykonuje pewnego rodzaju przetwarzanie.
- Tym razem podczas definiowania wywołania zwrotnego zwracana jest wartość zwana „obietnicą”.
- Zwracana obietnica może mieć 2 wyjścia. Określa to klauzula „then”. Każda operacja może zakończyć się sukcesem, co jest oznaczone parametrem „onFulfilled”. Lub może mieć błąd oznaczony parametrem „onRejected”.
Uwaga: Tak więc kluczowym aspektem obietnicy jest wartość zwracana. Nie ma pojęcia wartości zwracanej podczas pracy z normalnymi wywołaniami zwrotnymi w Node.js. Ze względu na wartość zwracaną mamy większą kontrolę nad tym, jak można zdefiniować funkcję zwrotną.
W następnym temacie zobaczymy przykład obietnic i korzyści płynące z wywołań zwrotnych.
Odwołania do obietnic
Spójrzmy teraz na przykład, jak możemy używać „obietnic” z poziomu aplikacji Node.js. Aby korzystać z obietnic w aplikacji Node.js, należy najpierw pobrać i zainstalować moduł „obietnica”.
Następnie zmodyfikujemy nasz kod, jak pokazano poniżej, który zaktualizuje Nazwę pracownika w kolekcji „Pracownik” za pomocą obietnic.
Krok 1) Instalacja modułów NPM
Aby korzystać z Promises z poziomu aplikacji Node JS, wymagany jest moduł promise. Aby zainstalować moduł obietnicy, uruchom poniższe polecenie
npm obietnica instalacji
Krok 2) Zmodyfikuj kod, aby zawierał obietnice
var Promise = require('promise');var MongoClient = require('mongodb').MongoClient;var url = 'mongodb://localhost/EmployeeDB';MongoClient.connect(url).then(function(err, db) {db.collection('Employee').updateOne({"EmployeeName": "Martin"}, {$set: {"EmployeeName": "Mohan"}});});
Objaśnienie kodu: -
- Pierwsza część ma zawierać moduł „promise”, który pozwoli nam korzystać z funkcji promise w naszym kodzie.
- Możemy teraz dołączyć funkcję „then” do naszej funkcji MongoClient.connect. Więc to, co to robi, to to, że kiedy nawiązywane jest połączenie z bazą danych, musimy wykonać zdefiniowany później fragment kodu.
- Na koniec definiujemy fragment kodu, który aktualizuje EmployeeName pracownika o nazwisku „Martin” na „Mohan”.
Uwaga:-
Jeśli teraz sprawdzisz zawartość bazy danych MongoDB, zobaczysz, że jeśli istnieje rekord o nazwie EmployeeName o wartości „Martin”, zostanie on zaktualizowany do „Mohan”.
Aby sprawdzić, czy dane zostały poprawnie wstawione do bazy danych, musisz wykonać następujące polecenia w MongoDB
- Użyj EmployeeDB
- db.Employee.find ({EmployeeName: Mohan})
Pierwsza instrukcja zapewnia połączenie z bazą danych EmployeeDb. Druga instrukcja wyszukuje rekord, który zawiera nazwisko pracownika „Mohan”.
Radzenie sobie z zagnieżdżonymi obietnicami
Definiując obietnice, należy zauważyć, że sama metoda „wtedy” zwraca obietnicę. W pewnym sensie obietnice można zagnieżdżać lub łączyć ze sobą.
W poniższym przykładzie używamy łańcucha do zdefiniowania 2 funkcji zwrotnych, z których obie wstawiają rekord do bazy danych MongoDB.
( Uwaga : łańcuch to koncepcja używana do łączenia wykonywania metod ze sobą. Załóżmy, że Twoja aplikacja ma 2 metody o nazwie „metodaA” i „metodaB”. Logika była taka, że „metodaB” powinna być wywoływana po „metodaA”, wtedy można połączyć wykonanie w taki sposób, że „methodB” zostanie wywołana bezpośrednio po „methodA”).
Kluczową rzeczą, na którą należy zwrócić uwagę w tym przykładzie, jest to, że kod staje się bardziej przejrzysty, czytelny i łatwy w utrzymaniu dzięki zastosowaniu zagnieżdżonych obietnic.
var Promise = require('promise');var MongoClient = require('mongodb').MongoClient;var url = 'mongodb://localhost/EmployeeDB';MongoClient.connect(url).then(function(db) {db.collection('Employee').insertOne({Employeeid: 4,EmployeeName: "NewEmployee"}).then(function(db1) {db1.collection('Employee').insertOne({Employeeid: 5,EmployeeName: "NewEmployee1"})})});
Objaśnienie kodu: -
- Definiujemy teraz 2 klauzule „then”, które są wykonywane jedna po drugiej. W pierwszej klauzuli then przekazujemy parametr „db”, który zawiera nasze połączenie z bazą danych. Następnie używamy właściwości collection połączenia „db”, aby wstawiać rekordy do kolekcji „Pracownik”. Metoda „insertOne” służy do wstawienia faktycznego dokumentu do kolekcji Employee.
- Jesteśmy następnie za pomocą 2 nd klauzuli wówczas także, aby wstawić nowy rekord do bazy danych.
Jeśli teraz sprawdzisz zawartość bazy danych MongoDB, znajdziesz 2 rekordy wstawione do bazy danych MongoDB.
Tworzenie niestandardowej obietnicy
Niestandardową obietnicę można utworzyć za pomocą modułu węzłowego o nazwie „q”. Bibliotekę „q” należy pobrać i zainstalować za pomocą menedżera pakietów węzłów. Po użyciu biblioteki 'q' można wywołać metodę „denodeify”, która spowoduje, że każda funkcja stanie się funkcją zwracającą obietnicę.
W poniższym przykładzie utworzymy prostą funkcję o nazwie „Dodaj”, która doda 2 liczby. Przekonwertujemy tę funkcję na funkcję zwracającą obietnicę.
Gdy to zrobimy, użyjemy obietnicy zwróconej przez funkcję Add do wyświetlenia komunikatu w console.log.
Wykonajmy poniższe kroki, aby utworzyć naszą niestandardową funkcję zwracającą obietnicę.
Krok 1) Instalacja modułów NPM
Aby użyć „q” z poziomu aplikacji Node JS, wymagany jest moduł „q”. Aby zainstalować moduł „q”, uruchom poniższe polecenie
npm install q
Krok 2) Zdefiniuj następujący kod, który zostanie użyty do utworzenia niestandardowej obietnicy.
Objaśnienie kodu: -
- Pierwszym bitem jest dołączenie biblioteki „q” za pomocą słowa kluczowego require. Korzystając z tej biblioteki, będziemy mogli zdefiniować dowolną funkcję zwracającą wywołanie zwrotne.
- Tworzymy funkcję o nazwie Add, która doda 2 liczby zdefiniowane w zmiennych a i b. Suma tych wartości będzie przechowywana w zmiennej c.
- Następnie używamy biblioteki q do denodeify (metoda używana do konwersji dowolnej funkcji na funkcję, która zwróciłaby obietnicę) naszej funkcji Add lub w inny sposób konwertuje naszą funkcję Add na funkcję, która zwraca obietnicę.
- Teraz wywołujemy naszą funkcję „Add” i jesteśmy w stanie uzyskać wartość obietnicy zwrotu z powodu poprzedniego kroku, który wykonaliśmy, polegającego na denodeifikacji funkcji Add.
- Użyte jest słowo kluczowe „then”, określające, że jeśli funkcja zostanie wykonana pomyślnie, należy wyświetlić ciąg „Funkcja dodawania zakończona” w pliku console.log.
Po uruchomieniu powyższego kodu w pliku console.log zostanie wyświetlone dane wyjściowe „Dodatkowa funkcja zakończona”, jak pokazano poniżej.
Podsumowanie
- Używanie funkcji zwrotnych w Node.js ma swoje wady. Czasami w trakcie tworzenia oprogramowania zagnieżdżone użycie funkcji zwrotnych może sprawić, że kod będzie bardziej bałaganiarski i trudny w utrzymaniu.
- Większość problemów z zagnieżdżonymi funkcjami zwrotnymi można złagodzić za pomocą obietnic i generatorów w node.js
- Obietnica to wartość zwracana przez funkcję asynchroniczną w celu wskazania zakończenia przetwarzania wykonywanego przez funkcję asynchroniczną.
- Obietnice można zagnieżdżać w sobie nawzajem, aby kod wyglądał lepiej i był łatwiejszy do utrzymania, gdy funkcja asynchroniczna musi zostać wywołana po innej funkcji asynchronicznej