我正在研究" learnyounode"练习9,Juggling Async。问题是:
此问题与上一个问题(HTTP COLLECT)相同 你需要使用http.get()。但是,这次你会 提供了三个URL作为前三个命令行参数 您必须收集每个URL提供给您的完整内容,并将其打印到控制台(stdout)。你不需要打印 超出长度,只将数据作为字符串;每个网址一行。抓住了 是你必须按照与URL相同的顺序打印出来 作为命令行参数提供给你。
我有两种不同的解决方案,大致相同。唯一的区别是工作的是模块化的而另一个不是(并且不起作用)。我无法理解差异和原因。这是我的代码:
工作解决方案:
const http = require('http');
const bl = require('bl');
var msgs = [];
var complete = 0;
function printAll() {
for (var i = 0; i < 3; i++) {
console.log(msgs[i]);
}
}
function doGet(i) {
http.get(process.argv[i + 2], function(res) {
res.pipe(bl(function(err, data) {
if (err) {
return console.error(err);
}
complete++;
msgs[i] = data.toString();
if (complete == 3) {
printAll();
}
}));
});
}
for (var i = 0; i < 3; i++) {
doGet(i);
}
错误的解决方案singleFunction.js
:
const http = require('http');
const bl = require('bl');
var msgs = [];
var complete = 0;
for (var i = 0; i < 3; i++) {
http.get(process.argv[i + 2], function(res) {
res.pipe(bl(function(err, data) {
if (err) {
return console.error(err);
}
complete++;
msgs[i] = data.toString();
if (complete == 3) {
for (var j = 0; j < 3; j++) {
console.log(msgs[j]);
}
}
}));
});
}
learnyounode run singleFunction.js
的输出:
undefined
undefined
undefined
我甚至不确定这里我不完全理解的是什么。是NodeJS事件循环,还是传递Javascript函数,NodeJS回调,甚至其他东西?谢谢你的帮助。
编辑:
最后找出原因并修复有用的评论。模块化解决方案起作用的原因是因为i
中doGet(i)
的范围以及回调与for循环不同。因此索引值是正确的。在调用任何回调之前,主for循环将完成并将i
增加到3路,从而在{1}处获得undefined
。