【问题标题】:Node.js: Juggling Async (learnyounode). Recursion in callback functions not working as expectedNode.js:杂耍异步(learnyounode)。回调函数中的递归未按预期工作
【发布时间】:2018-05-26 23:29:59
【问题描述】:

所以我正在解决这个名为 Juggling Asynclearnyounode 练习,它基本上给了我 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]);

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

【问题讨论】:

  • 您是否尝试过记录 data1 以首先查看返回的内容是什么?
  • 我没有。我现在尝试在 response1.on('data' 块内记录 data1 。有内容,但它会被记录多次。这可能意味着递归有问题,或者事件被多次发出?

标签: javascript node.js asynchronous callback


【解决方案1】:

看执行顺序。

  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

【讨论】:

  • 它退出函数作用域并进入调用console.log,所以你会得到空白字符串,因为那是你的数组当时包含的内容。我可能错了,但不应该t 所有递归回调都返回后控制流退出函数范围?
  • 不行,想想异步和同步执行的区别。您希望行为是同步的,但名称回调是不言自明的。它记录了当某个事件发生时要采取的行动。在您的情况下,http.get 不会返回任何内容。回调返回的值也不能在任何地方访问。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-26
  • 2015-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多