Несколько асинхронных обратных вызовов - Использование массива для запуска функции после завершения - PullRequest
1 голос
/ 19 января 2011

Я использую Node.js и делаю несколько асинхронных вызовов, с которыми мне нужно обрабатывать данные, когда все они заканчиваются. Я их вкладывал, но это было действительно неэффективно, так как нельзя начинать, пока не закончится предыдущий. Я придумал это, и мне просто интересно, есть ли в этом что-то явно не так:

var f = function(){},
    actualCallback = function() { /* Do real stuff */ },
    callbacks = [f, f, f, f, actualCallback];

aync(function() {
    callbacks.shift()();
});
aync(function() {
    callbacks.shift()();
});
aync(function() {
    callbacks.shift()();
});
aync(function() {
    callbacks.shift()();
});
aync(function() {
    callbacks.shift()();
});

Ответы [ 2 ]

2 голосов
/ 19 апреля 2013

Используйте функцию параллельный из асинхронной библиотеки .

1 голос
/ 19 января 2011

Не можете ли вы определить функцию, которая работает через массив?

function asyncSequence(callbacks) {
  function doAsync() {
    async(function() {
      if (!callbacks.length) return;
      callbacks[0]();
      callbacks = callbacks.slice(1);
      setTimeout(doAsync, 0);
    });
  }
  doAsync();
}

Затем вы вызываете это с помощью массива функций обратного вызова.

Теперь, если вы хотите запустить все асинхронные обратные вызовы одновременно, то я не вижу проблемы в первую очередь; просто запустите их по мере необходимости. Однако если вам нужно выполнить своего рода «соединение» в конце всех из них, вам придется отслеживать общий статус:

function asyncSequenceConcurrent(callbacks, whenFinished) {
  var incomplete = callbacks.length;
  for (var i = 0; i < callbacks.length; ++i) {
    async((function(i) {
      return function() {
        callbacks[i]();
        incomplete--;
        if (!incomplete) {
          whenFinished();
        }
      };
    })(i));
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...