Ваша логика выполнения несколько ошибочна. Вы должны сделать что-то вроде этого вместо
var checklist = [];
// checklist will contain sort of a counter
function reader_end(){
if(checklist.length == 2)
// doSomething only if both have been added to the checklist
doSomething();
}
reader1.on('end', function() {
checklist.push('reader1');
// increment the counter
reader_end();
});
reader2.on('end', function() {
checklist.push('reader2');
reader_end();
});
Хотя есть библиотеки лучше обрабатывать такого рода вещи, как Async и посылов.
С Async вам нужно использовать compose
var r12_done = async.compose(reader1.on, reader2.on);
r12_done('end', function(){
doSomething();
});
Edit: Я просто заметил, что с тех пор, вероятно, reader1.on
является Stream 'end' event, который не имеет стандартный аргумент обратного вызова подписи (err, results)
, это, вероятно, не сработает. В таком случае вам следует просто пойти с обещанием.
С Promise вам нужно сначала Promisify, а затем join
var reader1Promise = Promise.promisify(reader1.on)('end');
var reader2Promise = Promise.promisify(reader2.on)('end');
var reader12Promise = Promise.join(reader1Promise, reader1Promise);
reader12Promise.then(function(){
doSomething();
});
Это работает, спасибо @laggingreflex! Однако асинхронный с .on ('end') не работал для меня. Мне интересно, как async.parallel может работать для этого. – gattermeier
Оформить заказ. – laggingreflex