[英]Node.js: Juggling Async (learnyounode). Recursion in callback functions not working as expected
因此,我正在解决这个名为Juggling Async的 learnyounode
练习,该练习基本上为我提供3个URL,并要求我按URL输入的顺序输出URL内容。
我想出了一个递归解决方案,其中一个回调在保持退出计数器num
同时调用另一个回调。 但是,当我运行此命令时,无论输入什么,我都会在控制台上不断出现空白行。
这是短代码:
var url = ["", process.argv[2], process.argv[3], process.argv[4]];
var http = require('http');
var str = ["", "", "", ""];
var cnt = 1;
function dos(num, callback)
{
if(num == 4)
return;
http.get(url[num], function (response1){
// console.log(num);
response1.setEncoding('utf8');
response1.on('data', function(data1) {
str[num] = data1;
callback(num + 1, dos);
})
});
}
dos(1, dos);
console.log(str[1]);
console.log(str[2]);
console.log(str[3]);
现在,这是我第一次使用回调函数实现递归。 我仅在两天前就学会了回调函数,这可能意味着这里有些明显错误,我看不到。 请帮我看看。 谢谢。
查看执行顺序。
dos
函数 dos
函数 console.log
您的代码的问题是http.get
方法的异步性质。
在dos
的定义中,每当调用http.get
,都会附加一个回调,并且在该控制流之后存在函数作用域。 控制流没有停止,而是等待get
调用完成。
它退出函数作用域并移至调用console.log
因此您将获得空白字符串,因为那是此时数组所包含的内容。
为您达到预期的结果。
在函数调用中,而不是将data1
的值分配给str[num]
。 在适当的地方做一个简单的console.log(data1)
。
如果您仍然喜欢在代码中使用外部console.log
。 您了解了有关async\\await
。
dos
发票必须返回Promise
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.