Node.js: жонглирование асинхронным (learnyounode).Рекурсия в функциях обратного вызова не работает должным образом - PullRequest
0 голосов
/ 27 мая 2018

Итак, я решал это learnyounode упражнение под названием Juggling Async , которое в основном дает мне 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 Ответ

0 голосов
/ 27 мая 2018

Посмотрите на порядок выполнения.

  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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...