javascript - Node.js:杂耍异步(learnyounode)。回调函数中的递归未按预期工作

标签 javascript node.js asynchronous callback

所以我正在解决这个名为杂耍异步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

关于javascript - Node.js:杂耍异步(learnyounode)。回调函数中的递归未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50547814/

相关文章:

c# - 如何在 ASP.NET Core 中对 void 方法使用异步/等待?

node.js - 异步等待条件满足

javascript - JQuery Mobile 和 Cordova 页面模板

javascript - 正确的 node.js 抽象可防止访问以太坊区 block 链时的竞争条件

javascript - 无法设置未定义 Angular js 的属性

javascript - Node js Express js如何在POST方法rawbody中访问json对象

node.js - 使用默认快捷方式运行多个任务

php - 将 $_session ['username' ] 保存在 ajax 函数中

javascript - 元素的 ng-show 和 ng-hide - 隐藏项目后单击时,再次单击时,它们都会重新出现

javascript - 嵌入事件列表代码占据整页