Ответы пользователя по тегу Асинхронное программирование
  • Возможно ли асинхронно делать действия с элементами массива?

    @yeti357
    Воспользуйтесь промисами или либой типа async. Внезапно js поддерживает фичи функционального программирования. Из массива объектов можно создать массив промисов(или функций), а после запустить параллельное асинхронное выполнение, и получить результат, после того как все промисы/функции в массиве выполнились, Параллельный запуск осуществляется с помощью Promise.all() иди async.parallel()
    // псевдо код
    var yourArrayFromDB = [здесь массив исходных данных, например то, что вы до этого из бд запросили];
    var promiseArray = yourArrayFromDB.map( 
        (elem) => new Rromise( function (resolve, reject) {
                    // функция которая обрабатывает что вам нужно асинхронно
                    request.get('your.url.com', fuction( err, res) {
                         if (err) reject(err);
                         resolve(res);
                    })
                }
            )
    );
    
    Promise.all(promiseArray)
        .then((resArray) => { здесь делаете что хотите с массивом результатов асинхронных функций })
        .catch(console.log);
    Ответ написан
    1 комментарий
  • Асинхронный loop без ожидания завершения обработки элемента?

    @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
    Ответ написан
    5 комментариев