Bluebird NPM: Janji Bluebird JS dengan Contoh

โšก Ringkasan Cerdas

Bluebird JS adalah pustaka Promise berfitur lengkap untuk JavaSkrip yang kemampuan utamanya adalah promisifikasi: mengkonversi modul Node berbasis callback menjadi modul yang mengembalikan promise, sehingga seluruh pustaka seperti MongoDB Driver dapat digunakan secara asinkron.

  • ๐Ÿ”ต Kemampuan Inti: `promisifyAll` membungkus setiap metode dalam sebuah modul, menambahkan akhiran `Async` yang menandakan bahwa metode tersebut sekarang mengembalikan sebuah promise.
  • ๐Ÿ“ฆ instalasi: Satu perintah `npm install bluebird` akan menambahkan pustaka tersebut, setelah itu `require` akan mengekspos objek Promise.
  • ๐Ÿ”— rantai: Masing-masing kemudian menerima nilai resolusi sebelumnya, yang menggantikan callback bersarang dengan urutan langkah-langkah yang sederhana.
  • ๏ธ Aturan Penamaan: Hanya varian dengan akhiran Async yang mengembalikan promise; metode callback asli tetap tidak berubah di sampingnya.
  • ๐Ÿ›ก๏ธ Jalur Kegagalan: Satu tangkapan di ujung rantai akan menerima penolakan dari setiap langkah sebelumnya.
  • ๏ธ Konteks Modern: Fitur promise bawaan dan async await kini mencakup sebagian besar fungsi yang dulunya hanya disediakan oleh Bluebird.

Janji Bluebird JS

Apa itu Bluebird JS?

Bluebird JS adalah pustaka Promise berfitur lengkap untuk JavaScript. Fitur terkuatnya adalah kemampuannya untuk "mempromisifikasi" modul Node lainnya agar dapat digunakan secara asinkron. Promisifikasi adalah konsep yang diterapkan pada fungsi callback, dan memastikan bahwa setiap fungsi callback yang dipanggil akan mengembalikan nilai.

Jadi jika a Node.js Modul ini berisi fungsi callback yang tidak mengembalikan nilai, dengan memberikan janji bahwa modul tersebut secara otomatis memodifikasi semua fungsi di dalamnya sehingga masing-masing fungsi mengembalikan nilai.

Ini berarti Anda dapat menggunakan Bluebird untuk membuat MongoDB Modul ini berjalan secara asinkron, yang menambah kemudahan saat menulis aplikasi Node.js.

Contoh di bawah ini pertama-tama membuat koneksi ke koleksi โ€œEmployeeโ€ di database โ€œEmployeeDBโ€. Setelah koneksi terๅปบ็ซ‹, contoh ini mengambil semua catatan dalam koleksi tersebut dan menampilkannya di konsol.

Cara Menghasilkan Janji dengan Bluebird JS Library

Berikut adalah contoh langkah demi langkah yang menunjukkan cara menghasilkan promise dengan pustaka Bluebird JS.

Langkah 1) Menginstal modul NPM

Untuk menggunakan Bluebird dari dalam aplikasi Node, modul Bluebird diperlukan. Instal modul tersebut dengan perintah di bawah ini:

npm install bluebird

Langkah 2) Sertakan modul Bluebird

Langkah selanjutnya adalah menyertakan modul Bluebird dalam kode Anda dan melakukan promise pada keseluruhan proses. MongoDB Modul. Istilah "promisifikasi" di sini berarti Bluebird memastikan bahwa setiap metode yang didefinisikan di dalamnya MongoDB perpustakaan mengembalikan janji.

Sertakan modul Bluebird

Code Penjelasan:

  1. The require Perintah tersebut menyertakan pustaka Bluebird.
  2. Burung Biru .promisifyAll() Metode ini membuat versi asinkron dari setiap metode. MongoDB Modul ini menyediakan fungsi-fungsi tertentu, sehingga masing-masing berjalan di latar belakang dan mengembalikan sebuah promise.

Langkah 3) Terhubung ke basis data

Langkah terakhir adalah terhubung ke basis data, mengambil semua catatan dalam koleksi, dan menampilkannya di log konsol.

Hubungkan ke Basis Data

Code Penjelasan:

  1. Perhatikan connectAsync metode ini digunakan sebagai pengganti metode normal. connect metode. Bluebird menambahkan Asinkron akhiran untuk setiap metode dalam MongoDB Pustaka ini membedakan panggilan yang mengembalikan promise dari panggilan yang tidak. Metode tanpa akhiran Async tidak memberikan jaminan tersebut.
  2. Mirip dengan connectAsync, yang findAsync Metode ini mengembalikan semua catatan dalam MongoDB Koleksi โ€œKaryawanโ€.
  3. If findAsync Setelah berhasil diselesaikan, blok kode berikut akan mengulangi setiap catatan dalam koleksi dan menampilkannya di log konsol.

Jika langkah-langkah di atas dilakukan dengan benar, semua dokumen dalam koleksi Karyawan akan ditampilkan di konsol, seperti yang ditunjukkan pada output di bawah ini.

Bluebird menjanjikan hasil

Berikut kode lengkapnya sebagai referensi:

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

โš ๏ธ Catatan versi driver: Kode di atas menargetkan... MongoDB Driver Node 2.x, di mana connect diselesaikan dengan objek basis data. Dari driver 3.0 ke depan ini diselesaikan dengan MongoClient, jadi rantai tersebut harus memanggil client.db('EmployeeDB').collection('Employee') alih-alih db.collection('Employee')Versi driver modern juga sudah mengembalikan promise bawaan, yang membuat promisifyAll tidak perlu untuk MongoDB secara khusus.

Bluebird vs Native Promises: Mana yang Harus Digunakan?

Saat Bluebird pertama kali ditulis, Node sama sekali tidak mendukung promise, sehingga library ini mengisi celah yang benar-benar ada di platform tersebut. Node telah menyertakan promise bawaan sejak versi 4 dan seterusnya. async/await sejak versi 7.6, yang mengubah perhitungan secara signifikan bagi siapa pun yang memulai proyek saat ini.

Aspek Bluebird Janji Asli
Ketergantungan Sebuah paket npm untuk diinstal dan dipelihara. Terintegrasi ke dalam runtime.
Memberikan janji pada callback promisifyAll() mengkonversi seluruh modul util.promisify() mengubah satu fungsi
Pembantu tambahan peta, filter, properti, masing-masing, batas waktu, pembatalan semua, semua menetap, apa pun, hanya ras
Tumpukan panjang traces Ya, jika diaktifkan. Lebih baik tetapi lebih pendek
Terbaik untuk Pustaka callback lama, pembantu konkurensi Kode baru, dan apa pun yang menggunakan async await

Pilih promise bawaan untuk pekerjaan baru, karena promise tidak memerlukan dependensi dan terintegrasi langsung dengan async await. Gunakan Bluebird ketika dependensi masih hanya mengekspos callback, atau ketika helper konkurensinya, seperti Promise.map Dengan batasan konkurensi, hematlah sejumlah kode yang signifikan.

Cara Menangani Kesalahan dengan Bluebird Promises

Contoh di atas tidak memiliki jalur kegagalan. Jika MongoDB Jika promise tidak berjalan, atau nama koleksinya salah, rantai promise ditolak dan tidak ada yang dicetak โ€” proses tersebut langsung keluar tanpa penjelasan. Setiap rantai promise membutuhkan penangan terminal.

Bluebird mendukung .catch() untuk penolakan dan .finally() untuk pembersihan yang harus dijalankan dalam kondisi apa pun. Ini juga mendukung penanganan kesalahan bertipe, yang menangani satu kelas kesalahan sementara membiarkan kelas kesalahan lainnya menyebar.

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

Tiga kebiasaan penting di sini. Pertama, tempatkan .catch() di bagian akhir, bukan setelah setiap langkah, karena satu penangan terminal menerima penolakan dari setiap tautan sebelumnya dalam rantai. Kedua, gunakan .finally() untuk melepaskan sumber daya seperti koneksi basis data, karena berjalan pada jalur sukses dan gagal. Ketiga, jangan pernah meninggalkan rantai tanpa penanganan: penolakan yang tidak ditangani akan menghentikan proses Node pada versi saat ini, dan Bluebird akan mencetak peringatan eksplisit tentang hal itu sebelumnya. Mengaktifkan tumpukan panjang traces selama pengembangan dengan Promise.config({ longStackTraces: true }) membuat asal muasal penolakan jauh lebih mudah ditemukan.

Kesalahan dan Perbaikan Janji Burung Biru Biasa

Sebagian besar masalah Bluebird berasal dari konvensi penamaan yang menggunakan promise, atau dari pencampuran gaya pemanggilan callback dan promise dalam rantai yang sama, bukan dari kesalahan pada library itu sendiri. Setiap gejala di bawah ini menyebutkan penyebab dan solusinya.

  • โ€œconnectAsync bukanlah sebuah fungsiโ€: Modul tersebut dibutuhkan secara langsung, bukan melalui promisifyAll(), jadi tidak ada varian Async. Bungkus panggilan require seperti yang ditunjukkan di atas.
  • Memanggil metode biasa dan mendapatkan undefined: connect() masih mengharapkan callback. Hanya salinan dengan akhiran Async yang mengembalikan promise.
  • Meneruskan fungsi callback ke metode Async: tidak menyediakan panggilan balik maupun await dan promise tersebut tidak teramati. Gunakan satu gaya per panggilan, bukan keduanya.
  • menggunakan `promisifyAll` pada pustaka yang sudah berbasis promise: Tidak berbahaya tetapi tidak ada gunanya, dan menghasilkan nama dengan akhiran ganda yang membingungkan. Periksa dokumentasi pustaka terlebih dahulu.
  • Kehilangan kesalahan secara diam-diam: rantai tanpa .catch() Menyembunyikan alasan penolakan hingga Node melaporkan penolakan yang tidak ditangani dan keluar. Selalu akhiri rantai dengan blok catch, bahkan dalam skrip pendek.

Pertanyaan Umum Demo Slot

`promisifyAll` menambahkan salinan setiap metode alih-alih menggantinya, sehingga versi callback asli tetap berfungsi. Akhiran `Async` menandai salinan yang mengembalikan promise. Akhiran ini dapat dikonfigurasi melalui opsi `promisifier`.

Ya. Janji Bluebird sesuai dengan Promises/A+, jadi await Menerima modul tersebut persis seperti modul bawaan. Ini memungkinkan Anda untuk melakukan promise pada modul lama dan kemudian menggunakannya dengan sintaks modern.

Ya. AI Asisten menulis ulang callback bersarang menjadi rantai promise atau async await dengan andal. Verifikasi penanganan kesalahan setelahnya, karena konversi yang dihasilkan sering kali menghilangkan blok catch terminal.

Alat AI trace. tautan mana dalam rantai yang tidak memiliki pernyataan pengembalian, penyebab umum penolakan escapingMereka juga menandai rantai yang tidak memiliki penanganan kesalahan terminal, yang mengubah kesalahan yang ditangani menjadi crash.

Promise.all menunggu pada array promise yang sudah ada. Promise.map dari Bluebird membangunnya dari nilai-nilai dan menerima batasan konkurensi, yang mencegah ribuan permintaan simultan menghabiskan soket.

Ringkaslah postingan ini dengan: