当两个(!)事件触发.on('end')时执行

时间:2015-03-25 20:52:41

标签: node.js javascript-events node.js-stream

我有一个节点应用程序,它将两个文件作为流读取。我使用event.on('end')来处理结果。问题是我真的不知道如何等待BOTH事件触发'结束'。

我现在拥有的是:

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

对于小文件,这可行,但如果其中一个文件非常大,则应用程序将中止。

1 个答案:

答案 0 :(得分: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();
});

编辑:我刚才注意到,因为reader1.on可能是Stream 'end' event,它没有(err, results)的标准回调参数签名,这可能赢了不行。在这种情况下,你应该选择Promise。


使用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();
});