Контролирайте кода на потока чрез събитие в 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 не бъде обработено), какъв би бил най-добрият начин да организирам кода си? Това е node.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 lib, можете да напишете своя собствена 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