Samouczek dotyczący obietnicy Node.js
W poprzednich samouczkach widziałeś funkcje wywołania zwrotnego, które są używane do zdarzeń asynchronicznych. Ale czasami funkcje wywołania zwrotnego mogą stać się koszmarem, gdy zaczynają się zagnieżdżać, a program zaczyna być długi i skomplikowany.
Czym są obietnice?
Zanim zaczniemy od obietnic, przyjrzyjmy się najpierw ponownie, czym są funkcje „callback” w Node.js. W poprzednich rozdziałach widzieliśmy już wiele funkcji wywołania zwrotnego, więc szybko przeanalizujmy jedną z nich.
Poniższy przykład pokazuje fragment kodu, który służy do łączenia się z a MongoDB bazy danych i wykonać operację aktualizacji jednego z rekordów w bazie danych.
- W powyższym kodzie część funkcji (err,db) znana jest jako deklaracja funkcji anonimowej lub funkcji wywołania zwrotnego. Kiedy MongoClient tworzy połączenie z MongoDB database, powróci do funkcji wywołania zwrotnego po zakończeniu operacji połączenia. Tak więc w pewnym sensie operacje połączenia odbywają się w tle, a po ich zakończeniu wywołuje naszą funkcję wywołania zwrotnego. Pamiętaj, że jest to jeden z kluczowych punktów Node.js, aby umożliwić jednoczesne wykonywanie wielu operacji i tym samym nie blokować żadnego użytkownika przed wykonaniem operacji.
- Drugi blok kodu jest wykonywany po wywołaniu funkcji wywołania zwrotnego. Funkcja wywołania zwrotnego aktualizuje tylko jeden rekord w naszym MongoDB Baza danych.
Czym zatem jest obietnica? Cóż, obietnica to tylko ulepszenie funkcji wywołania zwrotnego w Node.js. W cyklu rozwoju może zaistnieć sytuacja, w której konieczne będzie zagnieżdżenie wielu funkcji wywołania zwrotnego. W pewnym momencie może to stać się trochę bałaganiarskie i trudne do utrzymania. Krótko mówiąc, obietnica jest ulepszeniem wywołań zwrotnych, które ma na celu złagodzenie tych problemów.
Podstawowa składnia obietnicy jest pokazana poniżej;
var promise = doSomethingAync() promise.then(onFulfilled, onRejected)
- „doSomethingAync” to dowolne wywołanie zwrotne lub funkcja asynchroniczna wykonująca pewien rodzaj przetwarzania.
- Tym razem przy definiowaniu wywołania zwrotnego zwracana jest wartość zwana „obietnicą”.
- Gdy obietnica jest zwracana, może mieć 2 wyjścia. Jest to zdefiniowane przez klauzulę „then”. Operacja może być sukcesem, co jest oznaczone przez parametr „onFulfilled”. Albo może mieć błąd, co jest oznaczone przez parametr „onRejected”.
Uwaga: Zatem kluczowym aspektem obietnicy jest wartość zwracana. Podczas pracy ze zwykłymi wywołaniami zwrotnymi w Node.js nie ma koncepcji wartości zwracanej. Dzięki zwracanej wartości mamy większą kontrolę nad sposobem definiowania funkcji wywołania zwrotnego.
W następnym temacie zobaczymy przykład obietnic i korzyści wynikające z wywołań zwrotnych.
Odwołania do obietnic
Przyjrzyjmy się teraz przykładowi wykorzystania „obietnic” z poziomu aplikacji Node.js. Aby móc korzystać z obietnic w aplikacji Node.js, należy najpierw pobrać i zainstalować moduł „promise”.
Następnie zmodyfikujemy nasz kod, jak pokazano poniżej, który aktualizuje nazwę pracownika w kolekcji „Pracownik” za pomocą obietnic.
Krok 1) Instalowanie modułów NPM
Aby używać Promises z poziomu aplikacji Node JS, wymagany jest moduł Promises. Aby zainstalować moduł obietnicy, uruchom poniższe polecenie
obietnica instalacji npm
Krok 2) Zmodyfikuj kod, aby uwzględnić 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" } }); });
Wyjaśnienie kodu: -
- Pierwsza część polega na dodaniu modułu „promise”, który umożliwi nam wykorzystanie funkcjonalności obietnicy w naszym kodzie.
- Możemy teraz dodać funkcję „wtedy” do naszej funkcji MongoClient.connect. Oznacza to, że po nawiązaniu połączenia z bazą danych musimy wykonać zdefiniowany później fragment kodu.
- Na koniec definiujemy nasz fragment kodu, który aktualizuje nazwę pracownika pracownika o imieniu „Martin” na „Mohan”.
Uwaga: -
Jeśli teraz sprawdzisz zawartość pliku MongoDB bazy danych, przekonasz się, że jeśli istnieje rekord o nazwie pracownika „Martin”, zostanie on zaktualizowany do „Mohan”.
Aby sprawdzić, czy dane zostały poprawnie wstawione do bazy danych, należy wykonać następujące polecenia: MongoDB
- Skorzystaj z bazy danych EmployeeDB
- db.Employee.find({NazwaPracownika:Mohan })
Pierwsza instrukcja zapewnia połączenie z bazą danych EmployeeDb. Druga instrukcja wyszukuje rekord, który ma nazwisko pracownika „Mohan”.
Radzenie sobie z zagnieżdżonymi obietnicami
Definiując obietnice należy zauważyć, że metoda „wtedy” sama w sobie zwraca obietnicę. W pewnym sensie obietnice można zagnieżdżać lub łączyć ze sobą.
W poniższym przykładzie używamy łączenia w celu zdefiniowania 2 funkcji wywołania zwrotnego, z których obie wstawiają rekord do MongoDB Baza danych.
(Note: Łańcuch to koncepcja używana do łączenia ze sobą wykonywania metod. Załóżmy, że Twoja aplikacja ma 2 metody zwane „metodą A” i „metodą B”. Logika była taka, że „metodaB” powinna być wywołana po „metodzieA”, a następnie można połączyć wykonanie w taki sposób, że „metodaB” zostanie wywołana bezpośrednio po „metodzieA”).
Najważniejszą rzeczą, na którą należy zwrócić uwagę w tym przykładzie, jest to, że kod staje się czystszy, czytelny i łatwiejszy w utrzymaniu dzięki użyciu 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" }) }) });
Wyjaśnienie kodu: -
- Definiujemy teraz 2 klauzule „wtedy”, które będą 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 kolekcji połączenia „db”, aby wstawić rekordy do kolekcji „Pracownik”. Do wstawienia aktualnego dokumentu do kolekcji Employee używana jest metoda „insertOne”.
- Następnie używamy 2nd klauzula then służąca także do wstawienia kolejnego rekordu do bazy danych.
Jeśli teraz sprawdzisz zawartość pliku MongoDB bazy danych, znajdziesz 2 rekordy wstawione do MongoDB Baza danych.
Tworzenie niestandardowej obietnicy
Niestandardową obietnicę można utworzyć za pomocą modułu węzła o nazwie „q”. Bibliotekę „q” należy pobrać i zainstalować za pomocą menedżera pakietów węzłów. Po skorzystaniu z biblioteki 'q' można wywołać metodę "denodeify", która sprawi, że dowolna funkcja stanie się funkcją zwracającą obietnicę.
W poniższym przykładzie utworzymy prostą funkcję o nazwie „Add”, która doda 2 liczby. Przekonwertujemy tę funkcję na funkcję zwracającą obietnicę.
Gdy już to zrobimy, wykorzystamy obietnicę zwróconą przez funkcję Add do wyświetlenia komunikatu w pliku console.log.
Wykonajmy poniższe kroki, aby utworzyć naszą niestandardową funkcję zwracającą obietnicę.
Krok 1) Instalowanie modułów NPM
Aby używać „q” z poziomu aplikacji Node JS, wymagany jest moduł „q”. Aby zainstalować moduł „q”, uruchom poniższe polecenie
npm zainstaluj q
Krok 2) Zdefiniuj następujący kod, który zostanie użyty do utworzenia niestandardowej obietnicy.
Wyjaśnienie kodu: -
- Pierwszym bitem jest włą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 zostanie zapisana w zmiennej c.
- Następnie używamy biblioteki q, aby odkodować (metoda używana do konwersji dowolnej funkcji na funkcję zwracającą obietnicę) naszą funkcję Add lub w inny sposób przekonwertować naszą funkcję Add na funkcję zwracającą obietnicę.
- Wywołujemy teraz naszą funkcję „Dodaj” i jesteśmy w stanie uzyskać obiecaną wartość zwrotu dzięki wcześniejszemu krokowi, który wykonaliśmy, czyli denodyfikacji funkcji Dodaj.
- Używane jest słowo kluczowe „then”, które określa, że jeśli funkcja zostanie wykonana pomyślnie, w pliku console.log zostanie wyświetlony ciąg „Funkcja dodawania zakończona”.
Po uruchomieniu powyższego kodu w pliku console.log zostanie wyświetlony komunikat „Funkcja dodawania ukończona”, jak pokazano poniżej.
Podsumowanie
- Korzystanie z funkcji wywołania zwrotnego w Node.js ma swoje wady. Czasami w procesie programowania zagnieżdżone użycie funkcji wywołania zwrotnego może sprawić, że kod będzie bardziej bałaganiarski i trudny w utrzymaniu.
- Większość problemów związanych z zagnieżdżonymi funkcjami wywołania zwrotnego można złagodzić, stosując obietnice i generatory 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, aby kod wyglądał lepiej i był łatwiejszy w utrzymaniu, gdy funkcja asynchroniczna musi zostać wywołana po innej funkcji asynchronicznej