基本上我在这里尝试做的是,使用nmap / nodejs在7台机器上进行nmap扫描,然后当响应回来时,我将其写入客户端页面。 当我运行它时它工作正常。它使用闭包,包装变量计数,所以每个回调得到count = 0。
现在我不明白,为什么count的值按照console.log从1增加到7。根据我的理解,每种方法都可以计算。
有人可以解释为什么这是
nodejs ::
的输出server is listening
8.8.8.1
8.8.8.2
8.8.8.3
8.8.8.4
8.8.8.5
8.8.8.6
8.8.8.8
count = 1
count = 2
count = 3
count = 4
count = 5
count = 6
count = 7
ending the response
代码::
var http = require('http');
var cb = function(httpRequest, httpResponse){
var count = 0;
var ips = [];
ips.push('8.8.8.1');
ips.push('8.8.8.2');
ips.push('8.8.8.3');
ips.push('8.8.8.4');
ips.push('8.8.8.5');
ips.push('8.8.8.6');
ips.push('8.8.8.8');
var exec = require('child_process').exec;
for(var i =0; i< ips.length ; i++)
{
exec('nmap.exe -v ' + ips[i], function(error, stdout, stderr) {
if(error)
{
httpResponse.write(stderr);
httpResponse.write("</br>")
httpResponse.write("*************************");
}
else
{
httpResponse.write(stdout);
httpResponse.write("</br>")
httpResponse.write("*************************");
}
count = count + 1;
console.log('count = ' + count);
if (count === 7)
{
console.log('ending the response');
httpResponse.end();
}
});
console.log(ips[i]);
}
}
var server = http.createServer(cb);
server.listen(8080, function(){
console.log('server is listening');
});
-Thanks
答案 0 :(得分:1)
因为在代码的第3行的全局空间中声明了count
,所以每个循环都将外部计数增加1。这不会导致您的计数重置。如果要实例化新的计数变量,则需要在循环中声明var count
。
答案 1 :(得分:0)
count
从1增加到7,因为在循环的每次迭代中,它都会增加1
,循环遍历包含7个元素的ips
数组。每个新请求都会将计数重置为0.每个请求都会迭代所有7个元素。
答案 2 :(得分:0)
看起来你想在count
变量上使用闭包。但是,您没有在count变量上实现闭包。为了将count
的副本传递给每个异步函数,您应该在以count
作为参数的函数调用中包装相应的代码块。例如:
var exec = require('child_process').exec;
for(var i =0; i< ips.length ; i++)
{
(function(count) { //Start of closure function storing a local copy of count
exec('nmap -v ' + ips[i], function(error, stdout, stderr) {
if(error)
{
httpResponse.write(stderr);
httpResponse.write("</br>")
httpResponse.write("*************************");
}
else
{
httpResponse.write(stdout);
httpResponse.write("</br>")
httpResponse.write("*************************");
}
count = count + 1;
console.log('count = ' + count);
if (count === 7)
{
console.log('ending the response');
httpResponse.end();
}
});
})(count); // end of closure function
console.log(ips[i]);
}
运行它会得到输出:
count = 1
count = 1
count = 1
count = 1
count = 1
count = 1
count = 1