@cat_crash

Почему код не выполняется

Доброго дня.
Последнее время я бью рекорды написания в хаб «NodeJS». Так сказать пропитываюсь этим движком больше и больше.

Достигнув определенных успехов опять уперся в проблему причины которой не понимаю до конца и соответственно не могу решить:
Код
...
for(var b=0, len = fields.length;b<len;b++){

	jsdom.env({
		html: './dummy.html',
		src: [jquery],
		done: function (errors, window) {
			console.log('aa');
		}
	})
	
len++;
	
}

упрощен для наглядности.
Собственно это некий прототип «бесконечного цикла». Но никак не пойму почему внутри цикла не выполняется код jsdom а точнее не выводится ничего в консоль.

Если у кого есть идеи почему, то был бы благодарен если бы натолкнули на мысль — как правильно реализовать такой алгоритм
  • Вопрос задан
  • 3182 просмотра
Пригласить эксперта
Ответы на вопрос 3
barmaley_exe
@barmaley_exe
Наверняка эта функция, как и (почти) всё в мире Node.JS, работает асинхронно. А так как цикл у Вас бесконечный, ему просто не остаётся процессорного времени, чтобы выполнить свои дела.

Но это лишь предположение.
Ответ написан
qxfusion
@qxfusion
Ответ достаточно простой — дело в том что Ваш код в принципе не вызывается.

Когда Вы выполняете функцию в ТЕКУЩЕМ контексте — то конвеер ноды (V8) занят выполнением Вашей функции — скажем например — function foo()
Вы пытаетесь создать объект jsdom НО результат метода env является асинхронным, поэтому он будет добавлен в стэк будущих вызовов, НО т.к. в текущем контексте функция foo еще не завершилось, то планировщик НЕ может перейти к другому заданию.

Например у Mozilla Rhino нет такой проблемы благодаря Java основе, но в V8 модель потоков исключительно однопоточная в рамках контекста.

Решение: попробуйте вызывать каждую интерацию через setTimeout или process.nextTick (хотя конечно этот метод будет скоро deprecated) тогда Вы получите сильно загруженный конвеер, однако у Вас будут работать асинхронные события.
P.S. при бесконечном заполнении стэка вызовов при количестве возвратов более чем 50000 нода скорее всего упадет, поэтому не забывайте контролировать рост очереди вручную.
Ответ написан
Комментировать
Tenkoff
@Tenkoff
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы