Я стараюсь следовать упражнениям из [узловой школы] [1]. Существует упражнение, в котором нужно собрать три потока и только распечатать вывод, когда все три потока выполнены. Без использования стороннего модуля.nodejs цикл событий, как правильно использовать nextTick
Может кто-нибудь указать, почему мой подход не работает? Она застревает в бесконечном цикле:
var http = require('http');
var concat = require('concat-stream');
var count = 3;
var str1, str2, str3;
http.get(process.argv[2], function (response) {
response.pipe(concat(function(data) {
str1 = data.toString();
--count;
}));
});
http.get(process.argv[3], function (response) {
response.pipe(concat(function(data) {
str2 = data.toString();
--count;
}));
});
http.get(process.argv[4], function (response) {
response.pipe(concat(function(data) {
str3 = data.toString();
--count;
}));
});
function foo() {
if (count > 0) {
process.nextTick(foo);
} else {
console.log(str1);
console.log(str2);
console.log(str3);
}
};
foo();
Вам не нужна рекурсивная функция. В случае успеха каждого запроса на получение, уменьшите счетчик, а затем проверьте, равно ли оно 0. Если оно равно 0, напечатайте строки. Ваш код выглядит так, как будто это сработает, но я бы использовал setTimeout вместо process.nextTick, так что рекурсии будут медленнее и менее интенсивны. проверка каждые 10-100 мс должна быть более чем достаточно быстрой. –
Использование простой [асинхронной библиотеки] (https://github.com/caolan/async) позволит решить эту проблему менее чем за минуту. – tadman
@tadman - возможно, вы пропустили часть о * Без использования стороннего модуля *. @kmansoor - вы используете 'concat-stream' ... который является сторонним модулем .... просто sayin ' –