![](/img/trans.png)
[英]Node.js: Juggling Async (learnyounode). Recursion in callback functions not working as expected
[英]Node.js “LearnYouNode” juggling async function not working
我是javascript和node.js的新手,所以这可能是基本的javascript问题。
我正在LearnLearnNode中解决此杂耍异步问题,但我不知道为什么我的代码无法正常工作。
我的代码:
const http = require('http');
var URLs = [process.argv[2], process.argv[3], process.argv[4]];
var strs = ["", "", ""];
var ctr = 0;
for(var i = 0; i < 3; i++){
http.get(URLs[i], (response) => {
response.setEncoding('utf8');
response.on('data', (data) => {
strs[i] += data;
});
response.on('end', () => {
ctr++;
if(ctr == 3){
console.log(strs[0]);
console.log(strs[1]);
console.log(strs[2]);
}
});
});
}
我的代码无效,但是此代码可以:
const http = require('http');
var URLs = [process.argv[2], process.argv[3], process.argv[4]];
var strs = ["", "", ""];
var ctr = 0;
function httpGet(i){
http.get(URLs[i], (response) => {
response.setEncoding('utf8');
response.on('data', (data) => {
strs[i] += data;
});
response.on('end', () => {
ctr++;
if(ctr == 3){
console.log(strs[0]);
console.log(strs[1]);
console.log(strs[2]);
}
});
});
}
for(var i = 0; i < 3; i++){
httpGet(i);
}
该代码只能通过将其作为函数来工作。 为什么是这样?
编辑:问题是“ strs [i] + =数据”部分不起作用!
预期:“十字架像草皮一样,有多雀斑的雀斑。你的小开膛手走了走动,交配着你的小开膛手k。”
实际:“”
预期:“当疯了似的,干得像牛奶棒一样。醒来像黏稠的喙,我的手拿来一点腊肠。他没有鹦鹉走私者,像秀场小马一样醒来。”
实际:“”
预期:“您要开挖的小开膛手小鸟。抓住我们的灌木丛牡蛎,您会把小开膛手dero堆起来。让一些苹果伴侣大吃一惊。”
实际:“”
当http.get运行时,“ i”的值在“ for”循环中为2,因为它是“ i”在循环中的最后一个值。 取而代之的是函数中的值是正确的'0''1'和'2',因为在函数中传递'i'时您在函数中具有局部变量。
它与关闭有关: https : //developer.mozilla.org/zh-CN/docs/Web/JavaScript/Closures
将异步方法包装在函数中效果更好的原因是,传递的索引i
与预期索引相同。
for (var i = 0; i < 3; i++) { setTimeout(function() { console.log(i) }, 1000); }
输出始终为3
,因为for循环在调用完成async方法之前完成。
但是,您可以在es6中使用let
关键字来保留被阻止的作用域变量。
for (let i = 0; i < 3; i++) { setTimeout(function() { console.log(i) }, 1000); }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.