2015-03-25 1 views
0

У меня есть приложение-узел, которое считывает два файла в виде потоков. Я использую event.on ('end'), чтобы затем работать с результатами. Проблема в том, что я действительно не знаю, как я могу ждать, пока события BOTH вызовут «конец».Выполнять, когда оба события (!) Fire .on ('end')

То, что я сейчас:

reader1.on('end', function(){ 
     reader2.on('end',function(){ 
      doSomething(); 
     }); 
    }); 

С небольшими файлами это работает, но если один из файлов очень велико приложение прерывается.

ответ

0

Ваша логика выполнения несколько ошибочна. Вы должны сделать что-то вроде этого вместо

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(); 
}); 
+0

Это работает, спасибо @laggingreflex! Однако асинхронный с .on ('end') не работал для меня. Мне интересно, как async.parallel может работать для этого. – gattermeier

+0

Оформить заказ. – laggingreflex

Смежные вопросы