Node.js中的异步http.get回调

时间:2014-02-18 01:49:19

标签: javascript node.js asynchronous

在Node中,我有这个功能片段(从实际功能大大减少,所以希望我没有删除任何重要的东西):

Driver.prototype.updateDevices = function() {
    for (ip in this.ips) {
        var curIp = ip;
        if (this.ips[curIp]) {  // in case this.ips[curIp] is set to undefined...
            http.get(
                {   host: curIp,
                    port: 80,
                    path: '/tstat'
                },
                function (res) {
                    var result = '';
                    res.on('data', function (chunk) {
                        result += chunk;
                    });
                    res.on('end', function () {
                        // Want to parse data for each ip, but
                        // curIp is always the last ip in the list
                    });
                }
            );
        };
    };
};

我所拥有的是“Driver”对象,其中包含“ips”,一个包含ip地址列表的对象,例如{“192.168.1.111”:{stuff},“192.168.1.112”:{stuff} }

当然,这是非常明显的,我忽略了,但我不能按预期工作。显然,http.get()被异步调用多次。这就是我想要的;但是,当获得结果并且调用“结束”回调函数时,我无法访问“curIp”变量,我想要包含从中回调的特定请求的原始IP地址。相反,“curIp”变量始终包含“this.ips”中的最后一个ip地址。我错过了什么?任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:2)

curIp不限于for循环,它的范围限定为封闭的updateDevices函数,因此它被所有http.get调用共享,并且每次都被for覆盖{1}}循环。

解决此问题的典型方法是创建一个立即函数,该函数创建自己的范围,可以捕获每个迭代的curIp值作为该函数的参数:

if (this.ips[curIp]) {
    (function(ip) {    // Immediate function with its own scope
        http.get(
            {   host: ip,
                port: 80,
                path: '/tstat'
            },
            function (res) {
                var result = '';
                res.on('data', function (chunk) {
                    result += chunk;
                });
                res.on('end', function () {
                    // ip is the captured ipCur here
                });
            }
        );
    })(curIp);   // Pass curIp into it as the ip parameter
};