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.