1

我正在使用 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);
4

3 回答 3

2

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

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

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

如果你想对 Javascript 中的异步行为/管理有更多的概念性方法,Trevor Burnham 有一本非常好的书,叫做“Async Javascript” http://pragprog.com/book/tbajs/async-javascript

于 2013-04-19T14:48:38.137 回答
1

您可以(并且应该)使用 Promise,就像 Simon 建议的那样。除非拼写错误,否则以下内容应该有效。

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 作为参数传递给其他函数。然后你可以编写一个函数来使用你的 dns 查找函数返回的数据,方法是让它接受(并返回)一个承诺。

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

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

    return deferred.promise;
}
于 2013-04-19T14:55:02.383 回答
0

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

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

于 2013-04-19T14:41:37.760 回答