Код потока управления через событие в javascript

[1,2,3].map(function(num) {
  client.fooBar(num);
  // don't move on until `foo` is emitted to `client`
});

client.on('foo', function(num) {
   console.log(num)
});

Когда вызывается client.fooBar, выполняется асинхронный вызов, и событие foo генерируется client. Если бы я хотел обрабатывать только одно число за раз (не переходить к 2, пока не будет обработано 1), как лучше всего организовать мой код? Это узел.js.


person switz    schedule 02.06.2015    source источник
comment
Ваш client.on реализован на стороне клиента? или это обратный вызов, который сообщает вам, что он отправлен клиенту?   -  person Tim    schedule 02.06.2015


Ответы (1)


Нет. Это совсем другой вопрос (switz).

Нет, совсем не отличается. У вас есть серия, вокруг которой нужна асинхронная (управляемая событиями) структура управления.

Поскольку ваша функция fooBar запускает событие foo, а не принимает обратный вызов, вам необходимо присоединить прослушиватель событий foo к управляющему коду, чтобы уведомить цикл, когда переходить к следующему элементу в массиве.

Если нет другого способа сообщить управляющей структуре, когда следует продолжить, я не вижу другого способа выполнить вашу задачу.

Это использует async.eachSeries для достижения вашей цели.

async.eachSeries([1,2,3], function(num, done) {
  client.once("foo", function() { done(); });
  client.fooBar(num);
}, function(err) {
  if (err) throw err;
  console.log("all done!");
});

Если вы не хотите зависеть от библиотеки async, вы можете написать свою собственную функцию asyncForEach.

function asyncForEach(arr, iterator, callback) {
  var queue = arr.slice(0);
  function next(err) {
    if (err) return callback(err);
    if (queue.length === 0) return callback(null);
    iterator(queue.shift(), next);
  }
  next();
}

Затем используйте его в своем коде

asyncForEach([1,2,3], function(num, done) {
  client.once("foo", function() { done(); });
  client.fooBar(num);
}, function(err) {
  if (err) throw err;
  console.log("all done!");
});
person Mulan    schedule 02.06.2015