Не. Това е съвсем различен въпрос (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