Bluebird NPM: Örnekle Bluebird JS Vaadi

⚡ Akıllı Özet

Bluebird JS, Promise tabanlı, tam özellikli bir kütüphanedir. JavaTanımlayıcı özelliği promise'leştirme olan betik: geri çağrı tabanlı Node modüllerini promise döndüren modüllere dönüştürmek, böylece tüm bir kütüphaneyi, örneğin... MongoDB Sürücü eşzamansız olarak kullanılabilir.

  • ???? Temel Yetenek: `promisifyAll`, bir modülün her yöntemini sarmalar ve yöntemin artık bir promise döndürdüğünü belirten bir `Async` soneki ekler.
  • ???? Kurulum: Tek bir `npm install bluebird` komutu kütüphaneyi ekler, ardından `require` komutu Promise nesnesini kullanıma sunar.
  • 🔗 Zincirleme: Ardından her biri önceki çözüm değerini alır ve bu değer, iç içe geçmiş geri çağırma işlevlerini düz bir adım dizisiyle değiştirir.
  • ???? ️ Adlandırma Kuralı: Yalnızca Async sonekiyle biten varyantlar promise döndürür; orijinal geri çağırma yöntemleri bunların yanında değişmeden kalır.
  • 🛡️ Başarısızlık Yolu: Bir zincirin sonundaki tek bir yakalama noktası, kendisinden önceki her adımdan ret yanıtı alır.
  • 🇧🇷 Modern Bağlam: Native Promises ve async await artık Bluebird'ün eskiden benzersiz olarak sağladığı işlevlerin çoğunu karşılıyor.

Bluebird JS Sözleri

Bluebird JS nedir?

Bluebird JS, Promise tabanlı, tam özellikli bir kütüphanedir. JavaBetik. En güçlü özelliği, diğer Node modüllerini eşzamansız olarak kullanabilmek için "promisify" etmenize olanak sağlamasıdır. Promisify, geri çağırma fonksiyonlarına uygulanan bir kavramdır ve çağrılan her geri çağırma fonksiyonunun bir değer döndürmesini sağlar.

Yani eğer bir node.js Bu modül, değer döndürmeyen bir geri çağırma fonksiyonu içerir ve bu da modülün içindeki tüm fonksiyonları otomatik olarak değiştirerek her birinin bir değer döndürmesini sağlar.

Bu, Bluebird'ü kullanarak şunları yapabileceğiniz anlamına gelir: MongoDB Bu modül eşzamansız olarak çalışır, bu da Node.js uygulamaları yazarken kolaylık sağlayan bir diğer unsurdur.

Aşağıdaki örnek, öncelikle "EmployeeDB" veritabanındaki "Employee" koleksiyonuna bir bağlantı kurar. Bağlantı kurulduktan sonra, koleksiyondaki tüm kayıtları alır ve konsolda görüntüler.

Bluebird JS Kütüphanesi ile Vaatler Nasıl Üretilir?

İşte Bluebird JS kütüphanesi ile promise'ler oluşturmanın adım adım bir örneği.

Adım 1) NPM modüllerinin kurulumu

Node uygulaması içinden Bluebird'ü kullanmak için Bluebird modülü gereklidir. Aşağıdaki komutla kurabilirsiniz:

npm install bluebird

Adım 2) Bluebird modülünü ekleyin

Bir sonraki adım, Bluebird modülünü kodunuza dahil etmek ve tüm işlemi promise tabanlı hale getirmektir. MongoDB modül. Burada vaat etmek, Bluebird'ün modülde tanımlanan her yöntemin çalışmasını sağlaması anlamına gelir. MongoDB kütüphane bir söz verir.

Bluebird modüllerini dahil edin.

Code Açıklama:

  1. MKS require Bu komut Bluebird kütüphanesini içerir.
  2. Mavi kuşun .promisifyAll() Bu yöntem, her yöntemin eşzamansız bir sürümünü oluşturur. MongoDB Bu modül, her birinin arka planda çalışmasını ve bir promise döndürmesini sağlar.

Adım 3) Veritabanına bağlanın

Son adım, veritabanına bağlanmak, koleksiyondaki tüm kayıtları almak ve bunları konsol günlüğünde görüntülemektir.

Veritabanına Bağlanma

Code Açıklama:

  1. Dikkat connectAsync normal yöntem yerine yöntem kullanılır. connect Bluebird yöntemi ekler. zaman uyumsuz her bir yöntemin sonuna eklenen sonek MongoDB Promise döndüren çağrıları, döndürmeyenlerden ayırt etmek için kullanılan bir kütüphane. Async soneki olmayan metotlar böyle bir garanti sağlamaz.
  2. Benzer connectAsync, findAsync Bu yöntem, kayıtların tümünü döndürür. MongoDB “Çalışan” koleksiyonu.
  3. If findAsync İşlem başarıyla tamamlandığında, aşağıdaki kod bloğu koleksiyondaki her kaydı tek tek inceler ve konsol günlüğünde görüntüler.

Yukarıdaki adımlar doğru şekilde gerçekleştirilirse, Çalışan koleksiyonundaki tüm belgeler aşağıdaki çıktıda gösterildiği gibi konsolda görüntülenir.

Bluebird çıktı vaat ediyor

İşte referans olması için kodun tamamı:

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

⚠️ Sürücü sürümü notu: Yukarıdaki kod şu hedefleri hedefliyor: MongoDB Node sürücüsü 2.x, burada connect Veritabanı nesnesiyle çözümlenir. Sürücüden. 3.0 ileri Bu, bir çözümle sonuçlanıyor. MongoClientBu nedenle zincirin arama yapması gerekiyor. client.db('EmployeeDB').collection('Employee') yerine db.collection('Employee')Modern sürücü sürümleri zaten yerel vaatler de döndürüyor, bu da promisifyAll için gereksiz MongoDB Özellikle.

Bluebird mi, Native Promises mi: Hangisini Kullanmalı?

Bluebird ilk yazıldığında, Node'da hiç promise desteği yoktu, bu nedenle kütüphane platformdaki gerçek bir boşluğu doldurdu. Node, 4. sürümünden beri yerel promise'leri sunuyor ve async/await 7.6 sürümünden bu yana, bugün bir projeye başlayan herkes için hesaplama önemli ölçüde değişiyor.

Görünüş Bluebird Yerli Vaatleri
Bağımlılık Kurulumu ve bakımı kolay bir npm paketi. Çalışma zamanına entegre edilmiştir.
Umut vadeden geri aramalar promisifyAll() bir modülün tamamını dönüştürür util.promisify() bir fonksiyonu dönüştürür
Ek yardımcılar harita, filtre, özellikler, her biri, zaman aşımı, iptal tümü, tümü Yerleşik, herhangi biri, sadece ırk
Uzun yığın traces Evet, etkinleştirildiğinde. Geliştirilmiş ama daha kısa
İçin en iyisi Eski geri çağırma kütüphaneleri, eşzamanlılık yardımcıları Yeni kod ve async await kullanan her şey

Yeni işler için yerel promise'leri tercih edin, çünkü bunlar herhangi bir bağımlılığa ihtiyaç duymaz ve async await ile doğrudan entegre olur. Bağımlılık yalnızca callback'leri ortaya çıkarıyorsa veya eşzamanlılık yardımcıları (örneğin, ...) gerekiyorsa Bluebird'e başvurun. Promise.map Eşzamanlılık sınırı belirleyerek önemli miktarda kod tasarrufu sağlayabilirsiniz.

Bluebird Promise'lerinde Hatalarla Nasıl Başa Çıkılır?

Yukarıdaki örnekte hata yolu bulunmamaktadır. Eğer MongoDB Eğer işlem çalışmıyorsa veya koleksiyon adı yanlışsa, zincir reddedilir ve hiçbir şey yazdırılmaz; işlem hiçbir açıklama yapılmadan sona erer. Her promise zincirinin bir sonlandırma işleyicisine ihtiyacı vardır.

Bluebird destekler .catch() retler için ve .finally() Her iki durumda da çalışması gereken temizleme işlemleri için. Ayrıca, bir hata türünü ele alırken diğerlerinin yayılmasına izin veren tür belirtilmiş yakalama işlemlerini de destekler.

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

Burada üç alışkanlık önemlidir. Birincisi, yer .catch() İkinci olarak, her adımdan sonra değil, en sonda kullanın, çünkü bir terminal işleyici zincirdeki her önceki bağlantıdan gelen retleri alır. .finally() Veritabanı bağlantısı gibi kaynakların serbest bırakılması için, hem başarılı hem de başarısız yollarda çalıştığı için uzun yığın etkinleştirilmelidir. Üçüncüsü, hiçbir zaman bir yakalama bloğu olmadan zinciri bırakmayın: ele alınmayan bir reddetme, mevcut sürümlerde Node işlemini sonlandırır ve Bluebird önceden bununla ilgili açık bir uyarı yazdırır. tracgeliştirme sırasında ile Promise.config({ longStackTraces: true }) Bu sayede reddedilmenin kaynağını bulmak çok daha kolaylaşır.

Bluebird Promisify'da Sık Karşılaşılan Hatalar ve Çözümleri

Bluebird'deki sorunların çoğu, kütüphanenin kendisindeki bir hatadan ziyade, promise tabanlı adlandırma kuralından veya aynı zincirde callback ve promise çağırma stillerinin karıştırılmasından kaynaklanır. Aşağıdaki her belirti, nedenini ve çözümünü belirtir.

  • “connectAsync bir fonksiyon değildir”: Modül, dolaylı olarak değil, doğrudan gerekliydi. promisifyAll()Dolayısıyla Async varyantları mevcut değil. `require` çağrısını yukarıda gösterildiği gibi sarmalayın.
  • Basit metodu çağırdığımda tanımsız (undefined) sonuç alıyorum: connect() Hala bir geri çağırma bekliyor. Yalnızca Async sonekiyle biten kopyası bir promise döndürür.
  • Asenkron bir metoda geri çağırma fonksiyonu iletme: ne bir geri arama sağlayın ne de await ve vaat fark edilmeden çözülür. Her çağrı için yalnızca bir stil kullanın, ikisini birden değil.
  • Zaten promise tabanlı bir kütüphanede `promisifyAll` kullanımı: Zararsız ama anlamsız ve kafa karıştırıcı çift ekli isimler oluşturuyor. Öncelikle kütüphane dokümantasyonunu kontrol edin.
  • Hataları sessizce kaybetmek: zincirsiz bir .catch() Node, işlenmemiş bir reddetme durumu bildirene ve çıkana kadar reddetme nedenini gizler. Kısa komut dosyalarında bile, zinciri her zaman bir `catch` bloğuyla sonlandırın.

SSS

`promisifyAll`, her bir metodu değiştirmek yerine onun bir kopyasını ekler, böylece orijinal geri çağırma sürümü çalışmaya devam eder. `Async` soneki, promise döndüren kopyayı işaretler. Bu sonek, `promisifier` seçeneği aracılığıyla yapılandırılabilir.

Evet. Bluebird vaatleri Promises/A+ uyumludur, bu nedenle await Bunları tıpkı yerel olanlar gibi kabul eder. Bu, eski bir modülü Promise dönüştürmenize ve ardından modern sözdizimiyle kullanmanıza olanak tanır.

Evet. AI Yardımcı fonksiyonlar, iç içe geçmiş geri çağırma işlevlerini güvenilir bir şekilde promise zincirlerine veya async await'e dönüştürür. Hata işlemeyi daha sonra doğrulayın, çünkü oluşturulan dönüşümler genellikle sondaki catch bloğunu atlar.

AI araçları tracBir zincirdeki hangi halkada dönüş ifadesi bulunmadığı, reddedilmenin olağan nedenidir.pingAyrıca, terminal yakalama mekanizması eksik olan zincirleri de işaretlerler; bu da ele alınan bir hatayı çökmeye dönüştürür.

Promise.all, mevcut bir promise dizisini bekler. Bluebird'ün Promise.map'i ise bu promise'leri değerlerden oluşturur ve eşzamanlılık sınırını kabul ederek binlerce eşzamanlı isteğin soketleri tüketmesini önler.

Bu yazıyı şu şekilde özetleyin: