Bluebird NPM: Bluebird JS Promise із прикладом

⚡ Розумний підсумок

Bluebird JS — це повнофункціональна бібліотека Promise для JavaСкрипт, визначальною можливістю якого є промісифікація: перетворення модулів Node на основі зворотних викликів у модулі, що повертають проміси, тому ціла бібліотека, така як MongoDB Драйвер можна використовувати асинхронно.

  • ???? Основні можливості: promisifyAll обгортає кожен метод модуля, додаючи суфікс Async, який сигналізує, що метод тепер повертає проміс.
  • 📦 Установка: Одна команда npm install bluebird додає бібліотеку, після чого require надає доступ до об'єкта Promise.
  • 🔗 Ланцюжок: Потім кожен отримує попереднє значення роздільної здатності, яке замінює вкладені зворотні виклики плоскою послідовністю кроків.
  • 🏷️ Правило найменування: Тільки варіанти з асинхронним суфіксом повертають обіцянки; оригінальні методи зворотного виклику залишаються незмінними разом з ними.
  • 🛡️ Шлях до відмови: Один перехоплювальний сигнал у кінці ланцюжка отримує відхилення з кожного попереднього кроку.
  • 🇧🇷 Сучасний контекст: Нативні обіцянки та асинхронне очікування тепер покривають більшу частину того, що колись унікально пропонував Bluebird.

Обіцянки Bluebird JS

Що таке Bluebird JS?

Bluebird JS — це повнофункціональна бібліотека Promise для JavaСкрипт. Його найсильнішою особливістю є те, що він дозволяє «обіцяти» іншим модулям Node для їх асинхронного використання. Promisify — це концепція, що застосовується до функцій зворотного виклику, і вона гарантує, що кожна викликана функція зворотного виклику повертає значення.

Тож якщо a Node.js Модуль містить функцію зворотного виклику, яка не повертає значення, що обіцяє, що модуль автоматично змінює всі функції в ньому так, щоб кожна з них повертала значення.

Це означає, що ви можете використовувати Bluebird для створення MongoDB модуль виконується асинхронно, що додає ще один рівень зручності під час написання Node.js-застосунків.

У наведеному нижче прикладі спочатку встановлюється з’єднання з колекцією «Employee» в базі даних «EmployeeDB». Після встановлення з’єднання програма отримує всі записи з колекції та відображає їх у консолі.

Як генерувати обіцянки за допомогою бібліотеки Bluebird JS

Ось покроковий приклад, що показує, як генерувати проміси за допомогою бібліотеки Bluebird JS.

Крок 1) Встановлення модулів NPM

Щоб використовувати Bluebird з Node-застосунку, потрібен модуль Bluebird. Встановіть його за допомогою команди нижче:

npm install bluebird

Крок 2) Включіть модуль Bluebird

Наступний крок — включити модуль Bluebird у ваш код та промісити весь його MongoDB модуль. Обіцянка тут означає, що Bluebird гарантує, що кожен метод, визначений у MongoDB бібліотека повертає обіцянку.

Включити модулі Bluebird

Code Пояснення:

  1. Команда require Команда містить бібліотеку Bluebird.
  2. Блубердс .promisifyAll() метод створює асинхронну версію кожного методу MongoDB модуль надає, тому кожен з них працює у фоновому режимі та повертає обіцянку.

Крок 3) Підключення до бази даних

Останній крок — підключення до бази даних, отримання всіх записів у колекції та їх відображення в журналі консолі.

Підключення до бази даних

Code Пояснення:

  1. Зверніть увагу на connectAsync метод використовується замість звичайного connect метод. Bluebird додає Асинхронізація суфікс до кожного методу в MongoDB бібліотека для розрізнення викликів, що повертають обіцянки, від тих, що не повертають. Методи без суфікса Async не мають такої гарантії.
  2. Як і в connectAsync, findAsync метод повертає всі записи в MongoDB Колекція «Працівник».
  3. If findAsync успішно вирішується, наступний блок перебирає кожен запис у колекції та відображає його в журналі консолі.

Якщо вищезазначені кроки виконано належним чином, усі документи з колекції Employee відображатимуться в консолі, як показано у виводі нижче.

Bluebird обіцяє вихід продукції

Ось повний код для довідки:

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

⚠️ Примітка щодо версії драйвера: цільовий код вище MongoDB Драйвер вузла 2.x, де connect вирішується за допомогою об'єкта бази даних. З драйвера 3.0 вперед це вирішується за допомогою MongoClient, тому ланцюжок повинен викликати client.db('EmployeeDB').collection('Employee') замість db.collection('Employee')Сучасні версії драйверів також вже повертають нативні обіцянки, що робить promisifyAll непотрібне для MongoDB конкретно.

Bluebird проти Native Promise: що використовувати

Коли Bluebird був вперше написаний, Node взагалі не мав підтримки promise, тому бібліотека заповнила справжню прогалину в платформі. Node постачає нативні promise, починаючи з версії 4, і async/await починаючи з версії 7.6, що значно змінює розрахунок для тих, хто починає проект сьогодні.

Аспект співочий птах Обіцянки рідних народів
Залежність npm-пакет для встановлення та підтримки Вбудовано у середовище виконання
Перспективні зворотні виклики promisifyAll() конвертує цілий модуль util.promisify() перетворює одну функцію
Додаткові помічники карта, фільтр, реквізит, кожен, час очікування, скасування всі, всіОсілені, будь-які, лише раса
Довгий стек traces Так, коли ввімкнено Покращено, але коротше
Найкраще для Застарілі бібліотеки зворотних викликів, помічники паралельності Новий код та все, що використовує асинхронність, очікують

Обирайте нативні проміси для нової роботи, оскільки вони не потребують залежностей та інтегруються безпосередньо з async await. Звертайтеся до Bluebird, коли залежність все ще надає доступ лише до зворотних викликів або коли її помічники паралельності, такі як Promise.map з обмеженням паралельності, заощаджуйте значний обсяг коду.

Як обробляти помилки за допомогою Bluebird Promises

У наведеному вище прикладі немає шляху до відмови. Якщо MongoDB не виконується, або назва колекції неправильна, ланцюжок відхиляє і нічого не виводиться — процес просто завершується без пояснень. Кожен ланцюжок обіцянок потребує термінального обробника.

Підтримка Bluebird .catch() для відмов та .finally() для очищення, яке має виконуватися в будь-якому випадку. Він також підтримує типізовані перехоплення, які обробляють один клас помилок, дозволяючи іншим поширюватися.

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

Тут важливі три звички. По-перше, місце .catch() в кінці, а не після кожного кроку, оскільки один обробник терміналу отримує відхилення від кожної попередньої ланки в ланцюжку. По-друге, використовуйте .finally() для звільнення ресурсів, таких як підключення до бази даних, оскільки воно виконується як на шляху успіху, так і на шляху невдачі. По-третє, ніколи не залишайте ланцюжок без перехоплення: необроблене відхилення завершує процес Node у поточних версіях, і Bluebird виведе явне попередження про це заздалегідь. Увімкнення довгого стеку tracпід час розробки з Promise.config({ longStackTraces: true }) значно полегшує пошук причини відмови.

Поширені помилки та виправлення Bluebird Promisify

Більшість проблем Bluebird виникають через угоду про іменування promisified або через змішування стилів виклику callback та promise в одному ланцюжку, а не через будь-яку помилку в самій бібліотеці. Кожен симптом нижче вказує свою причину та спосіб виправлення.

  • «connectAsync не є функцією»: модуль був потрібен безпосередньо, а не через promisifyAll(), тому асинхронних варіантів не існує. Зробіть виклик require обгорткою, як показано вище.
  • Виклик методу plain та отримання значення undefined: connect() все ще очікує зворотного виклику. Тільки копія з асинхронним суфіксом повертає обіцянку.
  • Передача зворотного виклику до асинхронного методу: не надають ні зворотного виклику, ні await і обіцянка виконується непомітно. Використовуйте один стиль для кожного виклику, а не обидва.
  • promisifyAll на бібліотеці, що вже базується на promise: нешкідливо, але безглуздо, і створює заплутані імена з подвійними суфіксами. Спочатку перевірте документацію бібліотеки.
  • Тихо втрачаючи помилки: ланцюг без .catch() приховує причину відхилення, доки Node не повідомить про необроблене відхилення та не завершить роботу. Завжди завершуйте ланцюжок за допомогою оператора catch, навіть у коротких скриптах.

Поширені запитання

promisifyAll додає копію кожного методу, а не замінює його, тому оригінальна версія зворотного виклику продовжує працювати. Суфікс Async позначає копію, що повертає проміс. Суфікс налаштовується за допомогою опції promisifier.

Так. Обіцянки Bluebird відповідають стандарту Promises/A+, тому await приймає їх точно так само, як і рідні. Це дозволяє вам промісити застарілий модуль, а потім використовувати його з сучасним синтаксисом.

Так. AI Помічники надійно переписують вкладені зворотні виклики в ланцюжки обіцянок або асинхронне очікування. Перевіряйте обробку помилок після цього, оскільки згенеровані конверсії часто втрачають термінальний catch.

Інструменти AI tracе. яка ланка ланцюга не має оператора return, що є звичайною причиною відхилення escapingВони також позначають ланцюжки, у яких відсутній термінальний catch, що перетворює оброблену помилку на збій.

Promise.all очікує на існуючий масив промісів. Promise.map від Bluebird будує їх зі значень та приймає обмеження паралельності, що запобігає вичерпанню сокетів тисячами одночасних запитів.

Підсумуйте цей пост за допомогою: