Node.js Promise oktatóanyag

⚡ Okos összefoglaló

A Node.js ígéretei a mélyen beágyazott visszahívásokat egy egyszeri lefutású visszaadott objektummal helyettesítik, így az aszinkron adatbázis-munka egy lapos, akkor záradékokból álló láncolatként olvasható, nem pedig anonim függvények piramisaként.

  • 🔘 Visszahívási probléma: A beágyazott visszahívások hosszúak és nehezen karbantarthatók.
  • ☑️ Az ígéret alapjai: Egy ígéret egy értéket ad vissza, és pontosan egyszer rendeződik.
  • ✅ Láncolás: majd maga ad vissza egy ígéretet, így a beszúrások sorrendben futnak.
  • 🧪 Egyedi ígéretek: A q könyvtár denodeify becsomagolja az összes visszahívást.
  • 🇧🇷 Modern forma: az aszinkron és a várakozás felhasználási ígéreteket fogad el visszahívások nélkül.
  • 📊 Hiba szabály: A kezeletlen elutasítások a Node.js 15-ös verziója óta leállítják a működését.

Node.js Promise oktatóanyag, amely bemutatja az ígéretekbe láncolt visszahívásokat

A korábbi oktatóanyagokban láthatta volna az aszinkron eseményekhez használt visszahívási funkciókat. De néha a visszahívási funkciók rémálommá válhatnak, amikor kezdenek egymásba ágyazni, és a program hosszú és összetett lesz.

Mik azok az ígéretek?

Mielőtt belekezdenénk az ígéretekkel, először nézzük át, hogy mik is a „visszahívó” függvények a node.jsAz előző fejezetekben már sokat láttuk ezeket a visszahívó függvényeket, ezért nézzük át gyorsan az egyiket.

Az alábbi példa egy kódrészletet mutat be, amely az a MongoDB adatbázist, és hajtson végre frissítési műveletet az adatbázis egyik rekordján.

Node.js visszahívó függvény csatlakozik a következőhöz: MongoDB és egy rekord frissítése

  1. A fenti kódban a függvény része (err,db) névtelen vagy visszahívási függvény deklarációjaként ismert. Amikor a MongoClient kapcsolatot hoz létre a MongoDB adatbázis, akkor a kapcsolati művelet befejezése után visszatér a visszahívási funkcióhoz. Tehát bizonyos értelemben a kapcsolódási műveletek a háttérben történnek, és amikor ez megtörtént, meghívja a visszahívási függvényünket. Ne feledje, hogy ez a Node.js egyik kulcsfontosságú pontja, amely lehetővé teszi számos művelet egyidejű végrehajtását, és így nem akadályozza meg a felhasználókat egy művelet végrehajtásában.
  2. A második kódblokk az, ami a visszahívási függvény tényleges meghívásakor kerül végrehajtásra. A visszahívási funkció csak egy rekordot frissít a mi listánkban MongoDB adatbázisban.

Akkor mi az ígéret? Nos, az ígéret csak a Node.js visszahívási funkcióinak továbbfejlesztése. A fejlesztési életciklus során előfordulhat, hogy több visszahívási függvényt kell egymásba ágyaznia. Ez egy bizonyos időpontban zavarossá válhat, és nehéz fenntartani. Röviden, az ígéret a visszahívások továbbfejlesztése, amely ezen problémák enyhítésére irányul.

Az ígéret alapvető szintaxisa alább látható;

var promise = doSomethingAync()
promise.then(onFulfilled, onRejected)
  • A „doSomethingAync” bármely visszahívási vagy aszinkron függvény, amely valamilyen feldolgozást végez.
  • Ezúttal a visszahívás meghatározásakor van egy érték, amelyet „ígéretnek” neveznek.
  • Ha egy ígéret visszaküldésre kerül, annak 2 kimenete lehet. Ezt az „akkor záradék” határozza meg. Bármelyik művelet sikeres lehet, amelyet az „onFulfilled” paraméter jelöl. Vagy lehet egy hiba, amelyet az „onRejected” paraméter jelöl.

A ígéret három állam egyikében ül és egyszer letelepszik:

Állami Jelentés
Függőben levő A munka még nem fejeződött be.
Teljesített Az onFulfilled lefut az adott értékkel.
Elutasítva Az onRejected hibával fut le.

Jegyzet: Tehát az ígéret legfontosabb szempontja a visszatérési érték. Ha normál visszahívásokkal dolgozik a Node.js-ben, akkor nincs visszatérési érték fogalma. A visszatérési érték miatt jobban szabályozhatjuk, hogyan határozható meg a visszahívási függvény.

Verzió megjegyzés: ezek a példák továbbra is futnak a Node.js 24-en, az Active LTS vonalon 2026-ban. A Node.js 15 óta kezeletlen elutasítás A figyelmeztetés kiírása helyett a folyamatot állítja le, ezért minden láncot a .catch() függvénnyel kell lezárni.

A következő témakörben egy példát láthatunk az ígéretekre, és arra, hogy milyen hasznuk származik a visszahívásokból.

Az ígéretek visszahívása

Most nézzünk egy példát arra, hogyan használhatjuk az „ígéreteket” egy Node.js alkalmazáson belül. Az ígéretek Node.js alkalmazásban való használatához először le kell tölteni és telepíteni kell a „promise” modult.

Ezután módosítjuk a kódunkat az alábbiak szerint, amely az „Employee” gyűjteményben található EmployeeName változót ígéretek használatával frissíti.

Step 1) A NPM modulok

A Promises modul Node.js alkalmazáson belüli használatához szükséges a promise modul. A promise modul telepítéséhez futtassa az alábbi parancsot.

npm telepítési ígéret

Step 2) Módosítsa a kódot, hogy ígéreteket tartalmazzon

A promise modul szerkesztői képernyőképe, amely átírja a MongoDB frissítés

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"
            }
        });
    }); 

Code Magyarázat:

  1. Az első rész az „ígéret” modul beépítése, amely lehetővé teszi számunkra az ígéret funkció használatát a kódunkban.
  2. A MongoClient.connect függvényünkhöz most hozzáfűzhetjük a „tén” függvényt. Tehát ez azt jelenti, hogy amikor létrejön a kapcsolat az adatbázissal, végre kell hajtanunk az ezután meghatározott kódrészletet.
  3. Végül meghatározzuk a kódrészletünket, amely elvégzi a „Martin” nevű alkalmazott EmployeeName-jének frissítését „Mohan”-ra.

Jegyzet:

Ha most ellenőrzi a tartalmát MongoDB adatbázisban, akkor azt találja, hogy ha létezik „Martin” EmployeeName rekord, akkor az „Mohan”-ra frissül.

Annak ellenőrzéséhez, hogy az adatok megfelelően kerültek-e be az adatbázisba, hajtsa végre a következő parancsokat MongoDB

  1. használja az EmployeeDB-t
  2. db.Employee.find({AlkalmazottNeve : „Mohan”})

Az első utasítás biztosítja, hogy csatlakozzon az EmployeeDB adatbázishoz. A második utasítás a „Mohan” alkalmazottnevet tartalmazó rekordot keresi.

Beágyazott ígéretekkel való foglalkozás

Az ígéretek meghatározásakor figyelembe kell venni, hogy maga a „majd” módszer ígéretet ad vissza. Tehát bizonyos értelemben az ígéretek egymásba ágyazhatók vagy egymáshoz láncolhatók.

Az alábbi példában láncolást használunk 2 visszahívási függvény definiálására, amelyek mindegyike beszúr egy rekordot a MongoDB adatbázisban.

(Megjegyzések: A láncolás egy olyan fogalom, amelyet a metódusok végrehajtásának összekapcsolására használnak. Tegyük fel, hogy az alkalmazásnak 2 metódusa van, a „methodA” és a „methodB”. És a logika olyan volt, hogy a 'methodB'-t a 'methodA' után kell meghívni, akkor a végrehajtást úgy kell láncolni, hogy a 'methodB' közvetlenül a 'methodA' után kerüljön meghívásra.)

Ebben a példában a legfontosabb megjegyezni, hogy a kód tisztábbá, olvashatóbbá és karbantarthatóbbá válik a beágyazott ígéretek használatával.

Láncolt, majd záradékok, amelyek két alkalmazotti rekordot illesztenek be MongoDB

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"
        })
    })
});

Code Magyarázat:

  1. Most definiálunk 2 „akkor” záradékot, amelyek egymás után kerülnek végrehajtásra. Az első then záradékban a 'db' paramétert adjuk át, amely tartalmazza az adatbázis-kapcsolatunkat. Ezután a 'db' kapcsolat collection tulajdonságát használjuk rekordok beszúrására az 'Alkalmazott' gyűjteménybe. Az „insertOne” metódus az aktuális dokumentum beszúrására szolgál az Employee gyűjteménybe.
  2. Ezután a 2-t használjuknd majd záradékkal egy másik rekordot is be kell illeszteni az adatbázisba.

Ha most ellenőrzi a tartalmát MongoDB adatbázisban a 2 rekordot beillesztve találja MongoDB adatbázisban.

Modern megfelelője: Az ES2017 óta szabványos async és await ezeket az ígéreteket visszahívások nélkül használják fel, és nagyrészt felváltották az generátor alapú folyamatszabályozási könyvtárak, mint például a co, míg a natív Promise támogatás redundánssá teszi a q-t és a bluebird-öt. A második blokk azt mutatja, hogy ekkor csak a db fogadása történik.

Egyedi ígéret készítése

Egyéni ígéret létrehozható a „q” nevű Node.js modul használatával. A „q” könyvtárat le kell tölteni és telepíteni kell a Node Package Manager segítségével. A „q” könyvtár használata után meghívható a „denodeify” metódus, amely bármely függvényt ígéretet visszaadó függvénnyé alakít.

Az alábbi példában létrehozunk egy „Hozzáadás” nevű egyszerű függvényt, amely 2 számot ad hozzá. Ezt a függvényt olyan függvényré alakítjuk, amely ígéretet ad vissza.

Ha ez megtörtént, a Hozzáadás függvény által visszaadott ígéret segítségével megjelenítünk egy üzenetet a console.log fájlban.

Kövesse az alábbi lépéseket az ígéret visszaadásához szükséges egyéni függvény létrehozásához.

Step 1) Az NPM modulok telepítése

A 'q' Node.js alkalmazáson belüli használatához a 'q' modul szükséges. A 'q' modul telepítéséhez futtassa az alábbi parancsot.

npm install q

Step 2) Határozza meg a következő kódot, amelyet az egyéni ígéret létrehozásához fog használni.

Egyedi ígéret, amelyet a csomagolás építettping egy Összeadó függvény q-val denodeify

Code Magyarázat:

  1. Az első bit a 'q' könyvtár felvétele a request kulcsszó használatával. Ennek a könyvtárnak a használatával bármilyen függvényt definiálhatunk a visszahívás visszaadásához.
  2. Létrehozunk egy Add nevű függvényt, amely összeadja az a és b változókban meghatározott 2 számot. Ezen értékek összege a c változóban lesz tárolva.
  3. Ezután a q könyvtárat használjuk az Add függvényünk denodeifikálására (az a metódus, amellyel bármely függvényt ígéretet visszaadó függvénnyé alakítunk), vagy más szóval az Add függvényünket ígéretet visszaadó függvénnyé alakítjuk.
  4. Most hívjuk a „Hozzáadás” függvényünket, és az előző lépésnek köszönhetően, amelyet az Add funkció denodeify-ként végrehajtottunk, kapunk egy visszatérési ígéret értéket.
  5. A 'then' kulcsszó azt adja meg, hogy ha a függvény sikeresen végrehajtódik, akkor a console.log naplóban a „Kiegészítő függvény befejezve” karakterlánc jelenjen meg.

A fenti kód futtatásakor a „Hozzáadás funkció befejeződött” kimenet jelenik meg a console.log fájlban, az alábbiak szerint.

Konzol kimenet nyomtatás Összeadó függvény befejezve az egyéni ígéretből

GYIK

A Node.js 15 óta a folyamat nem nulla értékű kóddal fejeződik be figyelmeztetés helyett. Csatold a .catch() függvényt minden lánchoz, vagy regisztrálj egy folyamatkezelő naplózni és helyreállítani.

A .catch() függvény fogadja a lánc korábbi szakaszaiban dobott hibákat, például egy try blokkot. A .finally() függvény a lánc lezárásának módjától függően fut le, így alkalmas egy kapcsolat lezárására.

A Promise.all gyorsan meghiúsul, ha egy bemenetet elutasítanak. Az allSettled mindig feldolgozza és jelenti az összes eredményt. A race az első rendezett eredményt fogadja el. Any-nek egy sikerre van szüksége, különben AggregateError hibát dob.

Mindkettő ugyanazt az ígéretet használja. Az aszinkron függvényeken belüli await pausok így az eredmények közönséges változókba kerülnek, a hibák pedig egy try and catch blokkba.

Ritkán. Generator A yield függvények korábban olyan könyvtárakat irányítottak, mint a co, de az async és az await natívan lefedik ezt a feladatot. Generatortovábbra is kompatibilisek a lusta szekvenciákkal és az egyéni iterátorokkal.

Az util.promisify közvetlenül konvertálja a visszahívási stílusú függvényeket, és az olyan modulok, mint az fs.promises, már visszaadják az ígéreteket. Mindkettő lecseréli a fent látható q könyvtárat.

Igen. A gépi tanuláson alapuló elemzők elutasító kezelő nélküli láncokat jelölnek meg, belső ciklusokra és sorrendfüggő írásokra várnak, majd rangsorolják az eredményeket. tesztek a legkockázatosabb utakat járja.

GitHub másodpilóta és hasonló ügynöki asszisztensek gyorsan átírják a beágyazott visszahívásokat várakozó hívásként, de minden átírást felül kell vizsgálni a hibautak és útvonal a szemantika csendben változik.

Foglald össze ezt a bejegyzést a következőképpen: