Buscar..


Prometiendo una devolución de llamada

Basado en devolución de llamada:

db.notification.email.find({subject: 'promisify callback'}, (error, result) => {
   if (error) {
       console.log(error);
   }

   // normal code here
});

Esto utiliza el método promisifyAll de bluebird para promisificar lo que es el código convencional basado en la devolución de llamada como el anterior. bluebird hará una versión prometedora de todos los métodos en el objeto, esos nombres de métodos basados ​​en promesas tienen Async añadido a ellos:

let email = bluebird.promisifyAll(db.notification.email);

email.findAsync({subject: 'promisify callback'}).then(result => {

    // normal code here
})
.catch(console.error);

Si solo hay que prometer métodos específicos, solo use su promisify:

let find = bluebird.promisify(db.notification.email.find);

find({locationId: 168}).then(result => {
    
    // normal code here
});
.catch(console.error);

Hay algunas bibliotecas (por ejemplo, MassiveJS) que no se pueden prometer si el objeto inmediato del método no se pasa al segundo parámetro. En ese caso, simplemente pase el objeto inmediato del método que debe ser promisificado en el segundo parámetro y encerrado en la propiedad de contexto.

let find = bluebird.promisify(db.notification.email.find, { context: db.notification.email });

find({locationId: 168}).then(result => {

    // normal code here
});
.catch(console.error);

Promisificando manualmente una devolución de llamada

A veces puede ser necesario promisificar manualmente una función de devolución de llamada. Esto podría ser en el caso de que la devolución de llamada no siga el formato estándar de error primero o si se necesita lógica adicional para prometer:

Ejemplo con fs.exists (ruta, 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 promisificado

function wait(ms) {
    return new Promise(function (resolve, reject) {
        setTimeout(resolve, ms)
    })
}


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow