有没有替代弃用的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 });
还要注意promisify
和promisifyAll
比使用new Promise
和Promiseify要快得多,因为他们利用dynamic重新编译技术和其他各种优化,所以最好使用它们(但只在初始化时)。