2016-08-03 7 views
1

私はこの問題で長い間働いていて、たくさんのサイトをサーフィンしましたが、説得力のある答えは見つかりませんでした。 私の要件を説明しましょう。私は端末からの入力を受け入れ、それらの入力を使用して一連の命令を実行し、次にprocess.stdinnodejsに入れて、端末からの新しい入力セットを受け入れます。process.stdinを使用してnodejsの端末からの動的入力を受け入れる際の問題

下記のサンプルコードをご覧ください。親切に私の間違いを軽く投げ、指示を伝える良い方法は、これは私がより良く学ぶのに役立ちます。

input(); 
console.log("Completed 1"); 
input(); 
function input() 
{ 
    process.stdin.setEncoding('utf8'); 
    process.stdin.resume(); 
    process.stdin.on('data',function(text){ 
    console.log("Type: " + typeof text); 
    if(text == "quit"){ 
     console.log("Inside if"); 
     done(); 
    } 
    console.log("Received: " + text); 
    }); 
} 

function done(){ 
    console.log("Exiting"); 
    process.exit(); 
} 

私はこのコードを実行すると、私の入力が「終了」であれば、このテキストは一致していないと、If条件を入力していません。それは何かを受け入れ続けます。

答えて

0

あなたが入力した文字列は、末尾に改行文字があります。

quit\n

はあなたの条件付きで、この問題を解決することを提供します。例としてdocumentationを参照してください。

input(); 
console.log("Completed 1"); 
input(); 
function input() 
{ 
    process.stdin.setEncoding('utf8'); 
    process.stdin.resume(); 
    process.stdin.on('data',function(text){ 
     console.log("Type: " + typeof text); 
     if(text === "quit\n"){ 
      console.log("Inside if"); 
      done(); 
     } 
     console.log("Received: " + text); 
    }); 
} 

function done(){ 
    console.log("Exiting"); 
    process.exit(); 
} 

編集:第2の懸案事項に対処するには、プロセスのドキュメントを参照してください。解決策は明らかです。コールを 'exit'イベントに戻します。そのコールバックでは同期コードのみが許可されます。

function input() { 
    process.stdin.setEncoding('utf8'); 
    process.stdin.resume(); 
    process.stdin.on('data',function(text){ 
     console.log("Type: " + typeof text); 
     if(text === "quit\n"){ 
      console.log("Inside if"); 
      done(); 
     } 
     console.log("Received: " + text); 
    }); 
    process.on('exit', (code) => { 
     console.log('got to it'); 
    }); } 
+0

このソリューションでは、これはまだ非同期に動作しているworking.Butです。前述したように、行ごとにコードを実行する必要があります。 PFB出力 **ディーパックする@ディーパック-VirtualBoxは:〜/デスクトップ$ノードが1 を完了 をtest.jsちょっと 受付:ちょっと 受付: は** を終了する場合はちょっと が、私はこれを削除した内部 を終了コード行 "console.log(" Type: "+ typeof text);" 他のパッケージを使用せずに同期実行を行うにはどうすればよいですか? – DeepakBilikere

+0

上記の編集を参照してください。 –

+0

あなたが提案したコールバックを考慮して、plesはquesのコードスニペットを参照してください。 ** 1。** input()を呼び出しています。これは、インラインのコンソール文を印刷する(またはビジネスロジックを使用する)場合にのみ、完全に実行する必要があります。 ** 2。**私がinput()でコールバックを持っていれば、あなたが提案した解決法に従って、input()を再利用することはできません。コールバック関数の同じコードセットは、 )。私があなたが紹介した文書を見て、それらのいくつかを試しましたが、私の要件を満たしませんでした。これはダムかもしれませんが、私はいくつかの助けを求めます。 – DeepakBilikere

0

あなたが実際にも改行文字を一致させる必要があるので、あなたはエンターキーを押し、「終了」を入力した後「\ n」は

代わりに、このお試しください:ところで

if(text == "quit\n") { 
    console.log("Inside if"); 
    done(); 
} 

をNode CLIアプリケーションの作成に役立つ素晴らしいパッケージがいくつかあります。

参照:

+0

このソリューションは動作していますが、これはまだ非同期で動作しています。前述したように、行ごとにコードを実行する必要があります。 PFB出力 **ディーパックする@ディーパック-VirtualBoxは:〜/デスクトップ$ノードが1 を完了 をtest.jsちょっと 受付:ちょっと 受付: は** を終了する場合はちょっと が、私はこれを削除した内部 を終了コード行 "console.log(" Type: "+ typeof text);" 他のパッケージを使用せずに同期実行を行うにはどうすればよいですか? – DeepakBilikere

関連する問題