所以我正在解决这个名为杂耍异步的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
。
关于javascript - Node.js:杂耍异步(learnyounode)。回调函数中的递归未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50547814/