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.

Obietnica Node.js

  1. 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.
  2. 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

Odwołania do obietnic

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: -

  1. Pierwsza część polega na dodaniu modułu „promise”, który umożliwi nam wykorzystanie funkcjonalności obietnicy w naszym kodzie.
  2. 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.
  3. 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

  1. Skorzystaj z bazy danych EmployeeDB
  2. 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.

Radzenie sobie z zagnieżdżonymi obietnicami

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: -

  1. 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”.
  2. 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.

Tworzenie niestandardowej obietnicy

Wyjaśnienie kodu: -

  1. 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.
  2. 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.
  3. 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ę.
  4. 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.
  5. 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.

Tworzenie niestandardowej obietnicy

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