Нет. Это совсем другой вопрос (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