Alex_Wells
@Alex_Wells
PHP/Kotlin

Асинхронный loop без ожидания завершения обработки элемента?

Здравствуйте. Есть массив. Для каждого элемента массива нужно асинхронно, без ожидания окончания обработки вызвать event. Для этого я решил использовать AsyncEventEmitter, вот что получилось, на примере:
for(var i=0; i<20; i++) {
	events.emit('test', '...');
}
events.on('test', function(data) {
	console.log('START');
	var sl = sleep(random.integer(1000, 5000));
	sleep(sl);
	console.log('END AFTER ' + sl);
});

function sleep(milliseconds) {
	var start = new Date().getTime();
	for (var i = 0; i < 1e7; i++) {
		if ((new Date().getTime() - start) > milliseconds) break;
	}
}


К сожалению это не работает, следующий евент вызывается только после окончания предыдущего. Это меня совсем не устраивает. Причем даже если убрать эвенты, а обычный for цикл заменить async'овской библиотекой - все равно ничего. Я хоть убейся не понимаю, как заставить его вызвать сразу все эвенты одновременно. sleep() используется чисто для имитации долгой обработки, представляет собой цикл.
  • Вопрос задан
  • 333 просмотра
Решения вопроса 2
@yeti357
Вы либо не понимаете как работает nodejs, либо не точно формулируете вопрос.
По поводу того, что у вас написано:
for(var i=0; i<20; i++) {
  events.emit('test', '...'); // при первой итерации емитится событие
}
events.on('test', function(data) {
  console.log('START');
  // если бы здесь был асинхронный вызов(обращение к бд/запрос на удалённый сервер и тд), 
  // то проблем бы не было  
  var sl = sleep(random.integer(1000, 5000)); // разобрана ниже
  sleep(sl);
  console.log('END AFTER ' + sl);
});

function sleep(milliseconds) { // функция вызываемая внутри события,
// она выполняется в основном потоке(для nodejs он один!), и соответсвенно блокирует(!) 
// поток выполнения, поэтому у вас не срабатываю остальные вызовы функции.
  var start = new Date().getTime();
  for (var i = 0; i < 1e7; i++) {
    if ((new Date().getTime() - start) > milliseconds) break;
  }
}

По комменту
Он может быть ТОЛЬКО синхронным
быть такого не может.
Но вообще посмотрите ещё на setImmidiate
Ответ написан
Вам выше уже ответили что у вас проблема только в том как конкретно вы тестируете. Я сам на этом однажды накололся.

Попробуйте сделать себе тестовый скрипт на том же PHP, который будет ждать перед ответом 1-10 секунд - в зависимости от параметра(разместите где-нибудь что бы был доступен по http). И дёргайте этот скрипт из NodeJs по http. (т.е. сэмулируете полностью свою задачу).

И увидите что будет корректно работать. Если конечно же вы будете асинхронные функции использовать для получения данных.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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