Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 构造函数的Q.nfcall或Q.denodeify_Javascript_Promise_Q - Fatal编程技术网

Javascript 构造函数的Q.nfcall或Q.denodeify

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调用函数,但是它对构造

我使用的库提供了一个类,其构造函数使用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
调用函数,但是它对构造函数是如何工作的呢?

我自己设法解决了这个问题。您可以使用
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
的情况下调用常规函数。相关:我完全同意。这太不酷了!:-)谢谢你的主意。