Bluebird Bluebird to wysoce wydajna, bogata w funkcje biblioteka obietnic (Promises) dla JavaScript i Node.js.
Przegląd łańcuchów metod
promise
.then(okFn, errFn)
.spread(okFn, errFn) // * Rozpakowuje tablicę do argumentów funkcji
.catch(errFn)
.catch(TypeError, errFn) // * Filtrowane przechwytywanie błędów
.finally(fn)
.map(function (e) { /* ... */ }) // * Współbieżna iteracja
.each(function (e) { /* ... */ }) // * Sekwencyjna iteracja
Metody oznaczone gwiazdką * to specyficzne rozszerzenia Bluebird wykraczające poza standard ES6.
Wiele argumentów i rozpakowywanie (Promise.spread)
Promise.resolve(['foo', 'bar'])
.spread((item1, item2) => {
console.log(item1, item2); // 'foo', 'bar'
});
Zobacz: Dokumentacja Promise.spread: Promise.spread
Łączenie niezależnych obietnic (Promise.join)
Koordynuje wiele niezależnych obietnic ze stałą sygnaturą wywołania:
Promise.join(
getPictures(),
getMessages(),
getTweets(),
(pics, msgs, tweets) => {
return { pics, msgs, tweets };
}
);
Zobacz: Dokumentacja Promise.join: Promise.join
Metody kolekcji tablicowych
Promise.all([p]): Rozwiązuje się, gdy wszystkie obietnice zakończą się sukcesem, lub odrzuca przy pierwszym błędzie.Promise.some([p], count): Rozwiązuje się, gdy określona liczba obietnic zakończy się pomyślnie.Promise.any([p]): Rozwiązuje się, gdy którakolwiek pojedyncza obietnica zakończy się pomyślnie.Promise.map(array, fn, { concurrency: 5 }): Mapuje elementy z kontrolowaną współbieżnością.
Promise.map(urls, url => fetch(url), { concurrency: 3 })
.then(responses => {
// Przetwarzanie odpowiedzi z limitem 3 jednoczesnych żądań
});
Obietnice obiektów (Promise.props)
Rozwiązuje obiekt zawierający obietnice do obiektu z rozwiązanymi wartościami:
Promise.props({
photos: getPhotos(),
posts: getPosts()
}).then(result => {
console.log(result.photos, result.posts);
});
Promisification (Konwersja funkcji callback)
Konwersja tradycyjnych funkcji zwrotnych (callbacks) Node.js na obietnice:
const fs = require('fs');
const Promise = require('bluebird');
// Promisify pojedynczej funkcji
const readFile = Promise.promisify(fs.readFile);
// Promisify całego modułu
Promise.promisifyAll(fs);
// Teraz metoda fs.readFileAsync jest natychmiast dostępna
Korutyny (Generatory)
const loginUser = Promise.coroutine(function* (email, password) {
const user = yield User.findOne({ email }).exec();
const valid = yield user.comparePassword(password);
if (!valid) throw new Error('Invalid credentials');
return user;
});