Bluebird Bluebird è una libreria di promise ad alte prestazioni e ricca di funzionalità avanzate per JavaScript e Node.js.
Panoramica sul concatenamento dei metodi
promise
.then(okFn, errFn)
.spread(okFn, errFn) // * Estrae gli elementi dell'array come argomenti
.catch(errFn)
.catch(TypeError, errFn) // * Catch filtrato per tipo di errore
.finally(fn)
.map(function (e) { /* ... */ }) // * Iterazione concorrente
.each(function (e) { /* ... */ }) // * Iterazione sequenziale
I metodi contrassegnati con * sono estensioni specifiche di Bluebird rispetto allo standard ES6.
Argomenti multipli e spreading
Promise.resolve(['foo', 'bar'])
.spread((item1, item2) => {
console.log(item1, item2); // 'foo', 'bar'
});
Vedi: Documentazione di Promise.spread: Promise.spread
Combinare promise fisse (Promise.join)
Coordina più promise indipendenti con una firma fissa:
Promise.join(
getPictures(),
getMessages(),
getTweets(),
(pics, msgs, tweets) => {
return { pics, msgs, tweets };
}
);
Vedi: Documentazione di Promise.join: Promise.join
Metodi per collezioni di array
Promise.all([p]): Si risolve quando tutte le promise hanno successo, o rifiuta al primo errore.Promise.some([p], count): Si risolve quando il numero indicato di promise ha successo.Promise.any([p]): Si risolve non appena una qualsiasi singola promise ha successo.Promise.map(array, fn, { concurrency: 5 }): Mappa gli elementi con livello di concorrenza controllato.
Promise.map(urls, url => fetch(url), { concurrency: 3 })
.then(responses => {
// Elabora risposte con massimo 3 richieste contemporanee
});
Promise di oggetti (Promise.props)
Risolve un oggetto contenente promise in un oggetto con le proprietà risolte:
Promise.props({
photos: getPhotos(),
posts: getPosts()
}).then(result => {
console.log(result.photos, result.posts);
});
Promisification (Da callback a promise)
Converte le consuete funzioni callback di Node.js in moderne promise:
const fs = require('fs');
const Promise = require('bluebird');
// Promisify di una singola funzione
const readFile = Promise.promisify(fs.readFile);
// Promisify di un intero modulo
Promise.promisifyAll(fs);
// Ora fs.readFileAsync è subito disponibile
Coroutine (Generatori)
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;
});