【问题标题】:Node.js DNS response delayedNode.js DNS 响应延迟
【发布时间】:2012-08-27 18:30:43
【问题描述】:

我只是想连接一个包含 DNS 解析结果域的数组。

这是我的代码:

        var ipList = [];
        for(var j=0; j < addressList.length; j++) {
            dns.resolve(addressList[j], function(error, ipRange) {
                if(error !== null) {
                    console.log('The DNS request failed.');
                }
                console.log('--1--');
                console.log(ipRange);
                console.log('--2--');
                ipList.concat(ipRange);
            });
        }

        console.log(ipList);

我得到的结果是这样的:

[]
--1--
[ '173.194.35.144',
  '173.194.35.145',
  '173.194.35.146',
  '173.194.35.147',
  '173.194.35.148' ]
--2--

看起来 DNS 解析响应在 concat() 之后到达,就像它被延迟了一样。 这意味着 ipList 是一个空数组。

谁能帮我解决这个问题? 提前致谢!

【问题讨论】:

    标签: node.js asynchronous dns callback


    【解决方案1】:

    resolve 是异步的,因此在您进行最终打印时并未完成。使用同步 DNS(不能立即为 node.js 找到这个),或者正确安排你的回调。

    【讨论】:

    • 该死的,我还以为会是这样。可悲的是我不知道如何解决它......
    • @AwakeZoldiek,您可以尝试递归(如果 addressList 永远不会长,则传入调用 console.log(ipList); 的回调。
    • 我不太明白你的意思。可以举个例子吗?
    • @AwakeZoldiek 真正了解 JavaScript 的单线程特性,需要process.nextTick howtonode.org/understanding-process-next-tick
    • @AwakeZoldiek github.com/caolan/async async 模块也在使用process.nextTick
    【解决方案2】:

    您可以执行类似的操作,跟踪未完成的 DNS 查询数量,以便了解完整集何时可用:

    var ipList = [], count = addressList.length;
    for(var j=0; j < addressList.length; j++) {
        dns.resolve(addressList[j], function(error, ipRange) {
            if(error !== null) {
                console.log('The DNS request failed.');
            } else {
                ipList.push(ipRange);
            }
            if (--count === 0) {
                // All DNS queries are complete.
                console.log(ipList);
            }
        });
    }
    

    【讨论】:

    • 您的 ipList.concat 呼叫应改为 ipList.push。我更新了我的帖子。
    • 哦,是的,完全错过了。现在一切正常。感谢您的快速回答!
    猜你喜欢
    • 2016-07-09
    • 2015-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多