Node.js
Обратный звонок для обещания
Поиск…
Продвижение обратного вызова
Обратный вызов на основе:
db.notification.email.find({subject: 'promisify callback'}, (error, result) => {
if (error) {
console.log(error);
}
// normal code here
});
Это использует метод promisifyAll от bluebird, чтобы обезопасить код, основанный на обратном вызове, как описано выше. bluebird выполнит обеими версиями всех методов в объекте, эти имена, основанные на методах обещания, добавили к ним Async:
let email = bluebird.promisifyAll(db.notification.email);
email.findAsync({subject: 'promisify callback'}).then(result => {
// normal code here
})
.catch(console.error);
Если нужно прокомментировать только определенные методы, просто используйте его обещание:
let find = bluebird.promisify(db.notification.email.find);
find({locationId: 168}).then(result => {
// normal code here
});
.catch(console.error);
Существуют некоторые библиотеки (например, MassiveJS), которые не могут быть обещаны, если непосредственный объект метода не передается во втором параметре. В этом случае просто передайте непосредственный объект метода, который должен быть пролонгирован по второму параметру и заключен в свойство контекста.
let find = bluebird.promisify(db.notification.email.find, { context: db.notification.email });
find({locationId: 168}).then(result => {
// normal code here
});
.catch(console.error);
Вручную пролонгировать обратный вызов
Иногда может потребоваться ручная проработка функции обратного вызова. Это может быть в случае, когда обратный вызов не соответствует стандартным формам ошибок или требуется дополнительная логика для того, чтобы обещать:
Пример с fs.exists (путь, обратный вызов) :
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 promisified
function wait(ms) {
return new Promise(function (resolve, reject) {
setTimeout(resolve, ms)
})
}