当两个(!)事件触发时执行 .on('end')
Execute when both(!) events fire .on('end')
我有一个节点应用程序可以将两个文件读取为流。我使用 event.on('end')
然后处理结果。问题是我真的不知道如何等待两个事件触发 'end'.
我现在拥有的是:
reader1.on('end', function(){
reader2.on('end',function(){
doSomething();
});
});
对于小文件这可行,但如果其中一个文件非常大,应用程序将中止。
你的执行逻辑有点问题。你应该改为这样做
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 you'll need to use compose
var r12_done = async.compose(reader1.on, reader2.on);
r12_done('end', function(){
doSomething();
});
编辑:我刚刚注意到,因为可能 reader1.on
是一个 Stream 'end' event,它没有 [=15= 的标准回调参数签名],这可能行不通。在那种情况下,您应该只使用 Promise。
和Promise you'll need to first Promisify and then 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();
});
我有一个节点应用程序可以将两个文件读取为流。我使用 event.on('end')
然后处理结果。问题是我真的不知道如何等待两个事件触发 'end'.
我现在拥有的是:
reader1.on('end', function(){
reader2.on('end',function(){
doSomething();
});
});
对于小文件这可行,但如果其中一个文件非常大,应用程序将中止。
你的执行逻辑有点问题。你应该改为这样做
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 you'll need to use compose
var r12_done = async.compose(reader1.on, reader2.on);
r12_done('end', function(){
doSomething();
});
编辑:我刚刚注意到,因为可能 reader1.on
是一个 Stream 'end' event,它没有 [=15= 的标准回调参数签名],这可能行不通。在那种情况下,您应该只使用 Promise。
和Promise you'll need to first Promisify and then 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();
});