0

2 つのファイルをストリームとして読み取るノード アプリがあります。私は結果を処理するために使用event.on('end')します。問題は、両方のイベントが「終了」をトリガーするのを待つ方法がよくわからないことです。

私が今持っているものは次のとおりです。

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

小さなファイルではこれは機能しますが、ファイルの 1 つが非常に大きい場合、アプリは中止されます。

4

1 に答える 1

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 や Promises など、この種のものをより適切に処理するためのライブラリがあります。


Asyncでは、使用する必要がありますcompose

var r12_done = async.compose(reader1.on, reader2.on);
r12_done('end', function(){
    doSomething();
});

編集:の標準コールバック引数シグネチャを持たないStream 'end' イベントreader1.onである可能性が高いため、これはおそらく機能しないことに気付きました。その場合は、Promise を使用する必要があります。(err, results)


Promiseでは、最初にPromisifyしてから参加する必要があります

var reader1Promise = Promise.promisify(reader1.on)('end');
var reader2Promise = Promise.promisify(reader2.on)('end');

var reader12Promise = Promise.join(reader1Promise, reader1Promise);

reader12Promise.then(function(){
    doSomething();
});
于 2015-03-26T01:37:12.883 に答える