有没有替代弃用的deferred.callback?

问题

我发现以下相当详细的模式通常出现在我的代码中,当我包含给我很难promisify对象的库:

 var object = crummyLibrary.create(); return new Promise(function(resolve, reject){ object.method('foo', function(err, bar){ if(err){ reject(err); }else{ resolve(bar); } }); }); 

对于Promise.defer()这个过去并不那么冗长:

 var deferred = Promise.defer(); object.method('foo', deferred.callback); return deferred.promise; 

但现在已经废弃了(出于很好的理由),但是我还没有find这个模式的一个很好的替代品。 我知道有这样的:

 return Promise.promisify(object.method, object)('foo'); 

但是,由于context / receiver的传递,它感觉很尴尬。

我在找什么

我希望能取代旧的deferred.callback ,也许是沿着以下的路线:

 var promise = new Promise; object.method('foo', promise.callback); return promise; 

或者可能:

 return new Promise(function(resolve, reject, callback){ object.method('foo', callback); }); 

或者,有人向我指出我一直在“做错事”。

从2.9.0开始,Bluebird提供了一个.fromNode方法,可以更快地dynamic显示不良行为的库:

 Promise.fromNode(object.method.bind(object, "foo")) 

我想可以执行下面的事情:

 return Promise.fromNodeFunction(function(callback){ object.method('foo', callback); }); 

只是需要考虑更好的名字,这不是冗长的…

要自己实现它:

 Promise.fromNodeFunction = function(resolver) { var d = Promise.defer(); try { resolver(d.callback); } catch (e) { d.reject(e); } return d.promise; }; 

这是最好的,因为它现在是3线,但箭头function是一个单线程:

 return Promise.fromNodeFunction(callback => object.method("foo", callback)) 

它也适用于绑定:

 return Promise.fromNodeFunction(object.method.bind(object, "foo")) 

那么promisify就是要在你的应用程序初始化时被调用一次。 您可以使用promisifyAll一次将整个API转换为promisified API。

 Promise.promisifyAll(app.auth); 

这将允许您在应用程序的任何时候使用任何方法作为app.auth上的承诺返回方法:

 app.auth.authenticateAsync("local").then(function(res){ // preserves context // handle result }); 

还要注意promisifypromisifyAll比使用new Promise和Promiseify要快得多,因为他们利用dynamic重新编译技术和其他各种优化,所以最好使用它们(但只在初始化时)。