JavaScript Funciones "prometedoras" con devoluciones de llamada


Ejemplo

Dada una función que acepta una devolución de llamada de estilo de nodo,

fooFn(options, function callback(err, result) { ... });

puedes promisificarlo (convertirlo en una función basada en la promesa) de esta manera:

function promiseFooFn(options) {
    return new Promise((resolve, reject) =>
        fooFn(options, (err, result) =>
            // If there's an error, reject; otherwise resolve
            err ? reject(err) : resolve(result)
        )
    );
}

Esta función se puede utilizar de la siguiente manera:

promiseFooFn(options).then(result => {
    // success!
}).catch(err => {
    // error!
});

De una manera más genérica, aquí se muestra cómo prometer cualquier función dada de estilo de devolución de llamada:

function promisify(func) {
    return function(...args) {
        return new Promise((resolve, reject) => {
            func(...args, (err, result) => err ? reject(err) : resolve(result));
        });
    }
}

Esto se puede utilizar de esta manera:

const fs = require('fs');
const promisedStat = promisify(fs.stat.bind(fs));

promisedStat('/foo/bar')
    .then(stat => console.log('STATE', stat))
    .catch(err => console.log('ERROR', err));