Promesa Bluebird y callback sin argumento de error

Estoy intentando promisificar una biblioteca de terceros que no usa el patrón de callback(err, data) . En su lugar, siempre devuelven la callback(data) y throw errores.

 Promise.promisifyAll(horse); var p = Promise.defer(); horse.drinkAsync() .error(function(data) { p.fulfill(data); }) .catch(function (err) { console.error('error occured', err); }); return p.promise; 

¿Cuál es una buena manera de envolver ese comportamiento con promesas y aún así tener un aspecto correcto y permitir detectar el error lanzado? La cláusula catch no se activa y la aplicación se bloquea.

A partir de Bluebird 2.1, ahora puede personalizar promisifyAll con un controlador de promisificación personalizado:

 function noErrPromisifier(originalMethod){ return function promisified() { var args = [].slice.call(arguments); // might want to use smarter var self = this // promisification if performance critical return new Promise(function(resolve,reject){ args.push(resolve); originalMethod.apply(self,args); // call with arguments }); }; } var horse = Promise.promisifyAll(require("horse"), { promisifier: noErrPromisifier }); horse.drinkAsync().then(function(data){ // Can use here, ow promisified normally. }); 

Si el método original se ejecuta de forma asíncrona, realmente no hay forma de envolverlo en un dominio, aunque nunca he visto una biblioteca que funcione tan mal.