繁体   English   中英

Node.js:杂耍异步(learnyounode)。 回调函数中的递归无法正常工作

[英]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]);

现在,这是我第一次使用回调函数实现递归。 我仅在两天前就学会了回调函数,这可能意味着这里有些明显错误,我看不到。 请帮我看看。 谢谢。

查看执行顺序。

  1. 您定义dos函数
  2. 您调用dos函数
  3. 您调用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM