Node.js
Rückruf an Versprechen
Suche…
Rückruf versprechen
Callback-basiert:
db.notification.email.find({subject: 'promisify callback'}, (error, result) => {
if (error) {
console.log(error);
}
// normal code here
});
Hierbei wird die promisifyAll-Methode von Bluebird verwendet, um zu versprechen, was herkömmlich auf Callback basierender Code wie oben beschrieben ist. bluebird wird eine Versprechungsversion aller Methoden im Objekt erstellen. An diese Versprechungsbasierten Methodennamen wurde Async angehängt:
let email = bluebird.promisifyAll(db.notification.email);
email.findAsync({subject: 'promisify callback'}).then(result => {
// normal code here
})
.catch(console.error);
Wenn nur bestimmte Methoden zugesagt werden müssen, verwenden Sie einfach das Versprechen:
let find = bluebird.promisify(db.notification.email.find);
find({locationId: 168}).then(result => {
// normal code here
});
.catch(console.error);
Es gibt einige Bibliotheken (z. B. MassiveJS), die nicht angekündigt werden können, wenn das unmittelbare Objekt der Methode nicht an den zweiten Parameter übergeben wird. Übergeben Sie in diesem Fall einfach das unmittelbare Objekt der Methode, das für den zweiten Parameter angekündigt werden muss, und fügt es in die Kontexteigenschaft ein.
let find = bluebird.promisify(db.notification.email.find, { context: db.notification.email });
find({locationId: 168}).then(result => {
// normal code here
});
.catch(console.error);
Einen Callback manuell versprechen
Manchmal ist es erforderlich, eine Callback-Funktion manuell zu veröffentlichen. Dies kann in einem Fall der Fall sein, in dem der Rückruf nicht dem Standard- Error-First-Format folgt oder wenn zusätzliche Logik erforderlich ist, um zu versprechen:
Beispiel mit fs.exists (Pfad, Rückruf) :
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 versprochen
function wait(ms) {
return new Promise(function (resolve, reject) {
setTimeout(resolve, ms)
})
}