Bluebird NPM: Bluebird JS Promise s příkladem

⚡ Chytré shrnutí

Bluebird JS je plně vybavená Promise knihovna pro JavaSkript, jehož definující schopností je promisifikace: převod modulů Node založených na zpětném volání na moduly vracející promisy, takže celá knihovna, jako například MongoDB Ovladač lze použít asynchronně.

  • 🔵 Základní schopnosti: Metoda promisifyAll zabalí každou metodu modulu a přidá příponu Async, která signalizuje, že metoda nyní vrací promise.
  • ???? Instalace: Jediný příkaz npm install bluebird přidá knihovnu a poté require zpřístupní objekt Promise.
  • 🔗 řetězení: Každý z nich pak obdrží předchozí hodnotu rozlišení, která nahradí vnořené zpětné volání plochou sekvencí kroků.
  • ???? ️ Pravidlo pojmenování: Pouze varianty s async suffix vracejí promisy; původní callback metody zůstávají spolu s nimi nezměněny.
  • 🛡️ Cesta k selhání: Jediný záchyt na konci řetězce obdrží odmítnutí z každého předchozího kroku.
  • 🇧🇷 Moderní kontext: Nativní promisy a async await nyní pokrývají většinu toho, co Bluebird dříve jedinečně poskytoval.

Sliby Bluebird JS

Co je Bluebird JS?

Bluebird JS je plně vybavená Promise knihovna pro JavaSkript. Jeho nejsilnější vlastností je, že umožňuje „promisifikovat“ další moduly Node, abyste je mohli používat asynchronně. Promisify je koncept aplikovaný na callback funkce a zajišťuje, že každá volána callback funkce vrátí hodnotu.

Takže pokud Node.js Modul obsahuje callback funkci, která nevrací hodnotu, což slibuje, že modul automaticky upraví všechny funkce v něm tak, aby každá z nich vracela hodnotu.

To znamená, že k vytvoření můžete použít Bluebird MongoDB modul běží asynchronně, což přidává další úroveň snadnosti při psaní Node.js aplikací.

Následující příklad nejprve naváže připojení ke kolekci „Employee“ v databázi „EmployeeDB“. Jakmile je připojení navázáno, načte všechny záznamy v kolekci a zobrazí je v konzoli.

Jak generovat sliby s Bluebird JS Library

Zde je podrobný příklad ukazující, jak generovat promisy pomocí knihovny Bluebird JS.

Krok 1) Instalace modulů NPM

Pro použití Bluebirdu z aplikace Node je vyžadován modul Bluebird. Nainstalujte ho pomocí níže uvedeného příkazu:

npm install bluebird

Krok 2) Přidejte modul Bluebird

Dalším krokem je zahrnutí modulu Bluebird do vašeho kódu a jeho promisifikace. MongoDB modul. Slibování zde znamená, že Bluebird zajistí, že každá metoda definovaná v MongoDB knihovna vrací slib.

Zahrnout moduly Bluebird

Code Vysvětlení:

  1. Jedno require Příkaz obsahuje knihovnu Bluebird.
  2. Bluebird's .promisifyAll() Metoda vytváří asynchronní verzi každé metody, kterou MongoDB modul poskytuje, takže každý z nich běží na pozadí a vrací promise.

Krok 3) Připojení k databázi

Posledním krokem je připojení k databázi, načtení všech záznamů v kolekci a jejich zobrazení v protokolu konzole.

Připojení k databázi

Code Vysvětlení:

  1. Všimněte si, že connectAsync metoda se používá místo běžné connect metoda. Bluebird připojuje Async přípona ke každé metodě v MongoDB knihovna pro rozlišení volání, která vracejí promise, od těch, která je nevrací. Metody bez přípony Async nemají žádnou takovou záruku.
  2. Podobně jako u connectAsyncse findAsync Metoda vrací všechny záznamy v MongoDB Kolekce „Zaměstnanec“.
  3. If findAsync Pokud se problém úspěšně vyřeší, následující blok projde každým záznamem v kolekci a zobrazí ho v protokolu konzole.

Pokud jsou výše uvedené kroky provedeny správně, všechny dokumenty v kolekci Employee se zobrazí v konzoli, jak je znázorněno na níže uvedeném výstupu.

Bluebird slibuje produkci

Zde je kompletní kód pro referenci:

var Promise = require('bluebird');

// promisifyAll adds an Async variant of every MongoDB method
var mongoClient = Promise.promisifyAll(require('mongodb')).MongoClient;

mongoClient.connectAsync('mongodb://localhost/EmployeeDB')

    .then(function(db) {
        return db.collection('Employee').findAsync({});
    })
    .then(function(cursor) {
        cursor.each(function(err, doc) {
            console.log(doc);
        });
    });

⚠️ Poznámka k verzi ovladače: výše uvedený kód cílí MongoDB Ovladač uzlu 2.x, kde connect řeší se pomocí databázového objektu. Z ovladače 3.0 dále vyřeší se to s MongoClient, takže řetězec musí volat client.db('EmployeeDB').collection('Employee') místo db.collection('Employee')Moderní verze ovladačů také již vracejí nativní promisy, což dělá promisifyAll zbytečné pro MongoDB specificky.

Bluebird vs. Native Promise: Který použít

Když byl Bluebird poprvé napsán, Node neměl žádnou podporu promise, takže knihovna zaplnila skutečnou mezeru v platformě. Node nabízí nativní promise od verze 4 a... async/await od verze 7.6, což značně mění výpočet pro každého, kdo dnes začíná s projektem.

Vzhled Bluebird Domorodé sliby
Závislost Balíček npm pro instalaci a údržbu Vestavěné do běhového prostředí
Slibné zpětné volání promisifyAll() převede celý modul util.promisify() převádí jednu funkci
Další pomocníci mapa, filtr, props, každý, časový limit, zrušení všichni, všichniUsazení, jakýkoli, pouze rasa
Dlouhý stack traces Ano, pokud je povoleno Vylepšené, ale kratší
Nejlepší pro Starší knihovny zpětných volání, pomocníci pro souběžnost Nový kód a cokoli, co používá async, await

Pro novou práci zvolte nativní promisy, protože nepotřebují žádnou závislost a integrují se přímo s async await. Po Bluebirdu se obraťte, když závislost stále zpřístupňuje pouze zpětná volání nebo když její pomocné funkce pro souběžnost, jako například Promise.map s limitem souběžnosti ušetřete smysluplné množství kódu.

Jak ošetřit chyby pomocí promisů Bluebird

Výše uvedený příklad nemá žádnou cestu k selhání. Pokud MongoDB neběží nebo je název kolekce nesprávný, řetězec odmítne a nic se nevypíše – proces se jednoduše ukončí bez vysvětlení. Každý řetězec promise potřebuje terminálový obslužný program.

Bluebird podporuje .catch() pro odmítnutí a .finally() pro čištění, které musí probíhat v obou směrech. Podporuje také typované zachycení, které zpracovává jednu třídu chyb, zatímco umožňuje šíření ostatních.

var Promise = require('bluebird');
var mongoClient = Promise.promisifyAll(require('mongodb')).MongoClient;

var connection;

mongoClient.connectAsync('mongodb://localhost/EmployeeDB')
    .then(function(db) {
        connection = db;
        return db.collection('Employee').findAsync({});
    })
    .then(function(cursor) {
        return cursor.toArrayAsync();
    })
    .then(function(docs) {
        docs.forEach(function(doc) { console.log(doc); });
    })
    .catch(Promise.TimeoutError, function(err) {
        console.error('The database did not respond in time.');
    })
    .catch(function(err) {
        // Any other rejection from any step above arrives here
        console.error('Query failed:', err.message);
    })
    .finally(function() {
        // Runs on success and on failure, so the socket always closes
        if (connection) { connection.close(); }
    });

Důležité jsou zde tři návyky. Zaprvé, místo .catch() na konci, nikoli po každém kroku, protože jeden terminálový obslužný program přijímá odmítnutí od každého předchozího článku v řetězci. Za druhé, použijte .finally() pro uvolnění zdrojů, jako je například databázové připojení, protože běží na cestách úspěchu i neúspěchu. Za třetí, nikdy nenechávejte řetězec bez zachycení: neošetřené odmítnutí ukončí proces Node v aktuálních verzích a Bluebird o tom předem vypíše explicitní varování. Povolení dlouhého zásobníku tracběhem vývoje s Promise.config({ longStackTraces: true }) mnohem snadněji lokalizuje původ odmítnutí.

Běžné chyby a opravy v programu Bluebird Promisify

Většina problémů s Bluebirdem pochází z konvence pojmenování promisifikací nebo z kombinace stylů volání callback a promise ve stejném řetězci, spíše než z chyby v samotné knihovně. Každý níže uvedený příznak pojmenovává svou příčinu a řešení.

  • „connectAsync není funkce“: modul byl vyžadován přímo, nikoli prostřednictvím promisifyAll(), takže neexistují žádné asynchronní varianty. Zabalte volání require, jak je znázorněno výše.
  • Volání metody plain a získání nedefinované hodnoty: connect() stále očekává zpětné volání. Pouze kopie s asynchronní příponou vrací promise.
  • Předání zpětného volání asynchronní metodě: neposkytují ani zpětné volání, ani await a slib se vyřeší nepozorovaně. Použijte jeden styl na volání, ne oba.
  • promisifyAll na knihovně již založené na promisech: neškodné, ale bezúčelné a vytváří matoucí názvy s dvojitou příponou. Nejprve si projděte dokumentaci ke knihovně.
  • Tichá ztráta chyb: řetěz bez .catch() skryje důvod odmítnutí, dokud Node nenahlásí neošetřené odmítnutí a neukončí se. Řetězec vždy ukončete příkazem catch, a to i v krátkých skriptech.

Nejčastější dotazy

promisifyAll přidá kopii každé metody, místo aby ji nahradil, takže původní verze zpětného volání nadále funguje. Přípona Async označuje kopii vracející promise. Příponu lze konfigurovat pomocí volby promisifier.

Ano. Promise Bluebird splňují standard Promises/A+, takže await přijímá je přesně jako nativní. To vám umožňuje slíbit starší modul a poté ho využívat s moderní syntaxí.

Ano. AI Asistenti spolehlivě přepíší vnořené zpětné volání do řetězců promise nebo async await. Následně ověřte ošetření chyb, protože generované konverze často ztrácejí terminálový catch.

Nástroje AI trace kterému článku v řetězci chybí příkaz return, obvyklá příčina odmítnutí escapingTaké označují řetězce, kterým chybí terminálový catch, což je to, co promění ošetřenou chybu v pád.

Promise.all čeká na existující pole promise. Bluebirdův Promise.map je sestavuje z hodnot a akceptuje limit souběžnosti, což zabraňuje vyčerpání socketů tisíci současných požadavků.

Shrňte tento příspěvek takto: