如何依次运行多个节点stream?

给定两个stream, stream1stream2 ,我怎么能顺序运行它们,如果有失败,抛出?

我正在寻找比这更简单的东西:

 stream1.on('end',function(){ stream2.on('end',done); }); stream1.on('error',function(error){done(error);}); stream2.on('error',function(error){done(error);}); 

谢谢。

有一些方法可以做到这一点,检查下一个链接,这将有助于如何以优雅的方式在节点中编写一些代码:

Node.js FLOW

希望它是你所需要的。

根据您的使用情况,您可以使用多数据stream模块将两个数据stream合并为一个数据stream。

多数据stream由一系列数据stream构build而成

 var MultiStream = require('multistream') var fs = require('fs') var streams = [ fs.createReadStream(__dirname + '/numbers/1.txt'), // contains a single char '1' fs.createReadStream(__dirname + '/numbers/2.txt'), // contains a single char '2' fs.createReadStream(__dirname + '/numbers/3.txt') // contains a single char '3' ] MultiStream(streams).pipe(process.stdout) // => 123 

如果组合stream不适合用例,您可以自行构build您的端到端事件发送function

 const fs = require('fs'); var number1 = fs.createReadStream('./numbers1.txt') .on('data', d => console.log(d.toString())); var number2 = fs.createReadStream('./numbers2.txt') .on('data', d => console.log(d.toString())); onEnd([number1, number2], function(err) { console.log('Ended with', err); }); function onEnd(streams, cb) { var count = streams.length; var ended = 0; var errored = null; function shouldEnd() { ended++; if (errored) { return; } if (count == ended) { cb(); } } function endWithError(err) { if (errored) { return; } errored = true; cb(err); } streams.forEach(s => s .on('end', shouldEnd) .on('error', endWithError) ); } 

onEnd函数可用于等待stream数组结束,或者为第一个发出的错误事件发出错误事件。

试着用Promise

 function doStream1(cb) { // put those operation on stream1 in the callback function... cb && cb(); var p = new Promise(function(resolve, reject) { stream1.on( 'end', resolve ); stream1.on( 'error', reject ); }); return p; } function doStream2(cb) { // some operation on stream2 on callback cb && cb(); var p = new Promise(function(resolve, reject) { stream2.on( 'end', resolve ); stream2.on( 'error', reject ); }); return p; } doStream1(cb).then(function() { return doStream2(cb); }).catch(function(e) { // error handling is here });