如何从回调中返回值

时间:2013-04-19 14:40:29

标签: javascript node.js

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

我目前的代码:

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);

3 个答案:

答案 0 :(得分:2)

原样,这是不可能的,因为它是异步的。您可以将所有代码放在回调中,但这可能不是最好的。

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

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

如果你想在Javascript中对异步行为/管理有更多的概念认可,那么Trevor Burnham的一本非常好的书称为“Async Javascript”http://pragprog.com/book/tbajs/async-javascript

答案 1 :(得分:1)

你可以(并且应该)使用像Simon建议的Promise。除了错别字,以下内容应该有效。

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);
})

这种方法的一个好处是你可以将promises作为参数传递给其他函数。然后你可以通过让它接受(并返回)一个promise来编写一个使用dns查找函数返回的数据的函数。

function useLookup(lookupPromise){
    var deferred = Q.defer();

    lookupPromise.then(function(lookupResponse){
        deferred.resolve(lookupResponse);
    }).fail(function(err){
        deferred.reject(err);
    })

    return deferred.promise;
}

答案 2 :(得分:0)

你做不到。 Javascript是异步的。您必须将所有带有逻辑的代码放入回调中。

Javascript将在var result = myfuction(domain);之后继续执行您的代码,并且不会等待回调执行。并且您的函数将不返回任何内容(未定义)