如何从callback中返回一个值

我使用node.js来执行DNS查找返回和IP地址( http://nodejs.org/api/dns.html )。 在这个例子中,我可以得到我的结果正确的日志,但我宁愿能够访问callback范围之外的variables。 这怎么可能?

我目前的代码:

var domain = 'google.co.uk'; dns.lookup(domain, function (err, aRecord) { if (err) throw err; console.log(aRecord); }); 

理想情况下,我希望能够执行以下内容:

 var domain = 'google.co.uk'; var myfunction = dns.lookup(domain, function (err, aRecord) { if (err) throw err; return aRecord; }); var result = myfuction(domain); 

因为这是不可能的,因为它是asynchronous的。 你可以将所有的代码放在callback中,但这可能不是最好的。

开发人员可以处理返回数据的asynchronous操作的一种方法是使用Promises。 我读过的有关诺言概念的最好的文章是这样的: http : //blog.jcoglan.com/2013/03/30/callbacks-are-imperative-promises-are-functional-nodes-biggest-missed-opportunity /给它一个阅读!

在节点中,一个众所周知的诺言库是Q: https : //github.com/kriskowal/q

如果你想在Javascript中使用asynchronous行为/pipe理的概念,那么Trevor Burnham写的一本非常好的书叫做“Async Javascript” 。http://pragprog.com/book/tbajs/async-javascript

你可以(也应该)使用诺言,就像西蒙build议的那样。 除了错别字,以下应该工作。

 var Q = require('q'); var domain = 'google.co.uk'; function myFunction(domain){ var deferred = Q.defer(); dns.lookup(domain, function (err, aRecord) { if (err) { return deferred.reject(err); } deferred.resolve(aRecord); }); return deferred.promise; } var lookupPromise = myFunction(domain); lookupPromise.then(function(response){ console.log(response); }) 

这种方法的一个好处就是可以将promise作为parameter passing给其他函数。 然后你可以编写一个函数,它使用dns查找函数返回的数据,让它接受(并返回)一个promise。

 function useLookup(lookupPromise){ var deferred = Q.defer(); lookupPromise.then(function(lookupResponse){ deferred.resolve(lookupResponse); }).fail(function(err){ deferred.reject(err); }) return deferred.promise; } 

你不能。 Javascript是asynchronous的。 你必须把所有的逻辑代码放在callback中。

var result = myfuction(domain);之后,Javascript将继续执行你的代码var result = myfuction(domain); 并且不会等待callback被执行。 而你的函数将不会返回任何结果(未定义)