Answer the question
In order to leave comments, you need to log in
Asynchronous loop without waiting for element to finish processing?
Hello. There is an array. For each element of the array, you need to asynchronously, without waiting for the end of processing, to call event. For this, I decided to use AsyncEventEmitter, here's what happened, using an example:
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;
}
}
Answer the question
In order to leave comments, you need to log in
Either you don't understand how nodejs works, or you don't formulate your question accurately.
Regarding what you wrote:
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;
}
}
It can ONLY be synchronousit cannot be.
Didn't find what you were looking for?
Ask your questionAsk a Question
731 491 924 answers to any question