Поиск…


Продвижение обратного вызова

Обратный вызов на основе:

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)
    })
}


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow