Um dos motivos pelos quais gostamos tanto de promessas é que elas nos permitem evitar o infame inferno de callbacks que todos nós experimentamos nos primeiros dias do Node.js. Quando vejo uma API que não usa o padrão de promessa, fico irritado. Felizmente, encontrei promisify-node, um módulo que envolve funções ou objetos em um invólucro de promessa para que o senhor possa evitar a bagunça do retorno de chamada!


Há algumas maneiras diferentes de usar o promisify-node. A primeira é envolver uma única função na promessa:



var promisify = require('promisify-node');

function async(callback) {
  callback(null, true);
}

// Convert the function to return a Promise.
var wrap = promisify(async);

// Invoke the newly wrapped function.
wrap().then(function(value) {
  console.log(value === true);
});


O senhor pode até mesmo envolver recursivamente as funções de um módulo Node.js:



var promisify = require('promisify-node');
var fs = promisify('fs');

// This function has been identified as an asynchronous function so it has
// been automatically wrapped.
fs.readFile('/etc/passwd').then(function(contents) {
  console.log(contents);
});


E então o senhor pode envolver os métodos de um objeto:



var promisify = require('promisify-node');

var myObj = {
  myMethod: function(a, b, cb) {
    cb(a, b);
  }
};

// No need to return anything as the methods will be replaced on the object.
promisify(myObj);

// Intentionally cause a failure by passing an object and inspect the message.
myObj.myMethod({ msg: 'Failure!' }, null).then(null, function(err) {
  console.log(err.msg);
});


Como muitas APIs de front-end estão migrando para APIs baseadas em promessas, seria incrível usar algo como o Promisify para adquirir o hábito de usá-las nos lados do servidor e do cliente. No entanto, esteja ciente de que esse módulo usa um trecho de código para detectar argumentos de função. Se o senhor não usar um nome de argumento de retorno de chamada frequentemente usado, como callback ou cb, a função promisify-wrapped pode não funcionar corretamente.