Javascript 构造函数的Q.nfcall或Q.denodeify
我使用的库提供了一个类,其构造函数使用Node.js回调模式:Javascript 构造函数的Q.nfcall或Q.denodeify,javascript,promise,q,Javascript,Promise,Q,我使用的库提供了一个类,其构造函数使用Node.js回调模式: new FooBar({key: value}, function(err, data) { console.log(data); }); 我想用承诺来代替,这样我就可以做这样的事情: fooBarWrapper({key: value}).then(function(data) { console.log(data); }); 我知道我可以用Q.denodeify创建包装器,或者用Q.nfcall调用函数,但是它对构造
new FooBar({key: value}, function(err, data) {
console.log(data);
});
我想用承诺来代替,这样我就可以做这样的事情:
fooBarWrapper({key: value}).then(function(data) {
console.log(data);
});
我知道我可以用
Q.denodeify
创建包装器,或者用Q.nfcall
调用函数,但是它对构造函数是如何工作的呢?我自己设法解决了这个问题。您可以使用Q.defer
将回调转换为承诺:
var deferred = Q.defer();
new FooBar({key: value}, deferred.makeNodeResolver());
deferred.then(function(data) {
console.log(data);
});
我把这个答案留在这里,希望它能帮助其他有同样问题的人。构造函数不应该进行异步调用。这样做并不有趣,因为创建此库的人在构造函数中执行异步IO,这对他们来说根本不酷:) 我建议您将该函数包装在回调中:
function fooBar(val, cb){
new FooBar(val, cb);
}
这将允许您从代码中调用
Q.nfcall
或Q.denodeify
。我相信这比创建一个显式的延迟策略要好 构造函数不能异步返回对象。因此,构造函数可能存储传入的回调函数,并在特定事件发生时调用它。如果不知道构造函数的使用情况,很难回答。实际上,我不想使用构造的对象。我只需要像调用任何其他静态函数一样调用构造函数。那么您可能不需要构造函数,只需要在不使用new
的情况下调用常规函数。相关:我完全同意。这太不酷了!:-)谢谢你的主意。