var http = require('http');
var res = ["","",""];
for(i =2;i<5;i++){
http.get(process.argv[i],function(response){
response.setEncoding('utf8');
str = "";
count =i-2;
response.on("data", function(data) {
str = str.concat(data);
});
response.on("end", function() {
res[count] = str;
console.log(count);
console.log(res[count]);
});
});
}
while(true) {
if(res[0]!==""&&res[1]!==""&&res[2]!=="")
{
console.log(res[0]);
console.log(res[1]);
console.log(res[2]);
break;
}
}
我将使用三个 URL 作为前三个命令行参数。我的工作是从每个 URL 收集数据作为字符串,并按照它们在命令行中出现的顺序将它们打印到控制台。现在代码不会打印任何内容,并且陷入无限循环。怎么了?
最佳答案
代码中有两个问题。首先,循环变量上有一个闭包,这使得值与您预期的不同,如 guvinder372 所解释的那样。另请参阅this answer其中讨论了该问题和 this answer这演示了使用 Function.bind
解决问题的更好方法。
第二个问题是最后设置 while
循环的方式。该循环将连续运行,并且绝不允许 http.get
中的回调函数运行。相反,检查回调是否有其他响应进入,一旦所有三个响应都进入,就打印输出。
for(i =2;i<5;i++){
http.get(process.argv[i],function(response){
response.setEncoding('utf8');
str = "";
count =i-2;
response.on("data", function(data) {
str = str.concat(data);
});
response.on("end", function() {
//Check here if responses are in
if(res[0]!==""&&res[1]!==""&&res[2]!=="") {
}
res[count] = str;
console.log(count);
console.log(res[count]);
});
});
}
关于javascript - Node.js 多个异步函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37065258/