Node.js
Richiamata per promettere
Ricerca…
Promuovere una richiamata
Richiamata a base di:
db.notification.email.find({subject: 'promisify callback'}, (error, result) => {
if (error) {
console.log(error);
}
// normal code here
});
Questo utilizza il promisifyAll metodo bluebird per promettere ciò che è convenzionalmente codice basato su callback come sopra. bluebird creerà una versione promettente di tutti i metodi nell'oggetto, i nomi dei metodi basati su promesse hanno accodati ad Async:
let email = bluebird.promisifyAll(db.notification.email);
email.findAsync({subject: 'promisify callback'}).then(result => {
// normal code here
})
.catch(console.error);
Se solo i metodi specifici devono essere promessi, basta usare la sua promessa:
let find = bluebird.promisify(db.notification.email.find);
find({locationId: 168}).then(result => {
// normal code here
});
.catch(console.error);
Ci sono alcune librerie (ad es., MassiveJS) che non possono essere promesse se l'oggetto immediato del metodo non viene passato sul secondo parametro. In tal caso, basta passare l'oggetto immediato del metodo che deve essere promesso sul secondo parametro e racchiuderlo nella proprietà context.
let find = bluebird.promisify(db.notification.email.find, { context: db.notification.email });
find({locationId: 168}).then(result => {
// normal code here
});
.catch(console.error);
Promessa manuale di un callback
A volte potrebbe essere necessario promettere manualmente una funzione di callback. Potrebbe trattarsi di un caso in cui la richiamata non segue il formato standard di errore prima o se è necessaria una logica aggiuntiva per promettere:
Esempio con fs.exists (percorso, callback) :
var fs = require('fs');
var existsAsync = function(path) {
return new Promise(function(resolve, reject) {
fs.exists(path, function(exists) {
// exists is a boolean
if (exists) {
// Resolve successfully
resolve();
} else {
// Reject with error
reject(new Error('path does not exist'));
}
});
});
// Use as a promise now
existsAsync('/path/to/some/file').then(function() {
console.log('file exists!');
}).catch(function(err) {
// file does not exist
console.error(err);
});
setTimeout promesso
function wait(ms) {
return new Promise(function (resolve, reject) {
setTimeout(resolve, ms)
})
}