2017-06-09 13 views
0

私は現在、モジュールthrough2concat-streamrequestを使用してNode.jsのストリームで練習しています。Node.jsのパイプチェーンを動的に拡張

request(process.argv[2]) 
.pipe(through(write, end)) 
.pipe(/*And */) 
.pipe(/* Some */) 
.pipe(/* more */) 
.on("finish",function(){ #Do some stuff }); 

function write(buf, enc, nxt){ 
    /*Push some data after some processing*/ 
} 
function end(done){ 
    done() 
} 

これは、パイプの静的なチェーンがある:

は、私はこのようなパイプ・チェーンを設定します。ユーザー入力の何らかの形で、パイプチェーンを動的に指定することは可能ですか?擬似コードで

:パイプ名を取り、各を通じてパイプ初期イベントストリーム関数を返すpiper関数を定義

const pipesMap = { 
    pipeName1: require('pipe-module'), 
    pipeName2: function(){}, 
    ... 
} 

をJSためにあなたの擬似コードを翻訳中

array_of_user_pipes = from_some_input; 
pipe_library = {pipe_name:pipe_callback} object, loaded into application logic 

perform the url request (fetch .txt file over the internet) 
for all pipe in array_of_user_pipes do 
    fetch pipe from pipe_library (simple key look-up) 
    chain pipe to chain 
execute the (dynamic) pipe chain 
+0

使用して同じことを行うことができます。このアプローチを実装する際に特定の問題が発生しましたか? –

+0

静的チェーンは 'メソッドチェーン化(method chaining) 'によって設定されているので、設定方法はあまりよく分かりません。反復している場合は不可能です。あるいは、チェーンにパイプを追加する別の方法がありますか? –

答えて

1

問題なしそのうちの。

const piper = pipes => request => 
     pipes.reduce((piped, pipe) => piped.pipe(pipesMap[pipe]), request) 


const userInputPipesArray = ['pipeName1', 'pipeName2'] 

piper(userInputPipesArray)(request(process.argv[2])).on('finish') 

編集

あなたはそれが全くなんとか見えforループ

let piped = request(process.argv[2]) 

for(let pipe of userInputPipesArray) { 
    piped = piped.pipe(pipeMap[pipe]) 
} 

piped.on('finish', ...) 
+0

ありがとう、私はそれを試してみます。このアプローチには特定の名前がありますか?私はそれを読んでみたい。 –

+0

このように 'reduce' aka' fold'が使われるときに特別な名前があるかどうかはわかりません。これは、for-loopを使用しないで行うことができます。 –

+0

ありがとうございます。これは私が欲しかったのとまったく同じように見えますが、おそらく私はあまりにも悲観的でした。 –

関連する問題