Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 使用封闭范围中的变量的函数的节点数组_Node.js_Node Async - Fatal编程技术网

Node.js 使用封闭范围中的变量的函数的节点数组

Node.js 使用封闭范围中的变量的函数的节点数组,node.js,node-async,Node.js,Node Async,我正在尝试使用async.parallel()对ip列表执行dns.reverse() 代码如下: var functions = []; for (var i = 0; i < data.length; i++) { var ip = data[i].ip; var x = function(callback) { dns.reverse(ip, (err, hostnames) => { if (err) {

我正在尝试使用
async.parallel()
对ip列表执行
dns.reverse()

代码如下:

var functions = [];
for (var i = 0; i < data.length; i++) {
    var ip = data[i].ip;
    var x = function(callback) {
        dns.reverse(ip, (err, hostnames) => {
            if (err) {
                log.error("Error resolving hostname for [" + ip + '] ' + err);
                return callback(null, err);
            }

            callback(null, hostnames);
        });
    };

    functions.push(x);
}

async.parallel(functions, (err, results) => {
    for(var i = 0; i < data.length; i++) {
        data[i]['hostnames'] = results[i];
    }

    handler(null, data);
});
var函数=[];
对于(变量i=0;i{
如果(错误){
log.error(“解析[”+ip+']'+err的主机名时出错”);
返回回调(null,err);
}
回调(空,主机名);
});
};
功能。推送(x);
}
async.parallel(函数,(错误,结果)=>{
对于(变量i=0;i

正在发生的是
dns.reverse()
正在使用相同的ip(数据数组中的最后一个)调用所有调用。可能是我做错了什么。有人能解释一下我的错误吗?

第一次回调是在整个for循环完成后执行的,因为它是异步的。 ip的值将是循环最后一次迭代中的值。 您可以放置一些console.log来了解真正发生的事情

正确的做法可能是:

async.parallel(data.map(({ ip }) => callback => {
    dns.reverse(ip, callback)
}), (err, results) => {
    for (var i = 0; i < data.length; i++) {
       data[i]['hostnames'] = results[i];
    }

    handler(null, data);  
})

多亏了@apokryfos,我得到了一个提示。为了让代码正常工作,我只需要在声明ip时使用let而不是var

        var functions = [];
        for (var i = 0; i < data.length; i++) {
            let ip = data[i].ip;
            var x = function(callback) {
                dns.reverse(ip, (err, hostnames) => {
                    if (err) {
                        log.error("Error resolving hostname for [" + ip + '] ' + err);
                        return callback(null, err);
                    }

                    callback(null, hostnames);
                });
            };

            functions.push(x);
        }
        async.parallel(functions, (err, results) => {
            for(var i = 0; i < data.length; i++) {
                data[i]['hostnames'] = results[i];
            }

            handler(null, data);
        });
var函数=[];
对于(变量i=0;i{
如果(错误){
log.error(“解析[”+ip+']'+err的主机名时出错”);
返回回调(null,err);
}
回调(空,主机名);
});
};
功能。推送(x);
}
async.parallel(函数,(错误,结果)=>{
对于(变量i=0;i

对于任何有兴趣了解以下内容的人来说,这可能会有所帮助:

在调用时将使用
ip
的值调用它,而不是在声明时调用它。
        var functions = [];
        for (var i = 0; i < data.length; i++) {
            let ip = data[i].ip;
            var x = function(callback) {
                dns.reverse(ip, (err, hostnames) => {
                    if (err) {
                        log.error("Error resolving hostname for [" + ip + '] ' + err);
                        return callback(null, err);
                    }

                    callback(null, hostnames);
                });
            };

            functions.push(x);
        }
        async.parallel(functions, (err, results) => {
            for(var i = 0; i < data.length; i++) {
                data[i]['hostnames'] = results[i];
            }

            handler(null, data);
        });