2017-07-04 6 views
2

node.jsコンソールアプリケーションを作成しています。私は次のように2つのsetTimeout関数を持っています。node.jsのパイプライン化setTimeout

setTimeout(function(){ 
    process.stdout.write('\n\nJokes Apart !!!\n\n'); 
}, 2000); 

setTimeout(function(){ 
    process.stdout.write('\n\nLet\'s play a game !!!\n\n'); 
}, 1000); 

私が実際に意図しているのは、最初のメッセージは2秒後に来るはずです。その後、1秒後に2番目のメッセージが表示されます。しかし、何が起きているかは、1秒後に2番目のメッセージが表示され、最初のメッセージが表示されます。両方の関数は非同期であるため、一度に呼び出されています。それらをパイプライン化する方法はありますか?

答えて

2

setTimout()はJavascriptでブロックしていません。だから、あなたは、2人のタイマーが将来実行されるようにスケジュールしています。 1つはからに1秒間実行されます。もう1つはから2秒後にになります。したがって、あなたが観察した動作を取得します。

最初のスケジュールを2秒後に実行し、1秒後に1秒後に3秒後にスケジュールすることができます。

setTimeout(function(){ 
    process.stdout.write('\n\nJokes Apart !!!\n\n'); 
}, 2000); 

// schedule this one to be 3 seconds from now, which will be 1 second after the prior one 
// since that one fired in 2 seconds 
setTimeout(function(){ 
    process.stdout.write('\n\nLet\'s play a game !!!\n\n'); 
}, 3000); 

それとも、あなたがそのコールバックで今してから2秒を実行するための最初のものをスケジュールすることができ、あなたがしたときに最初の火災から1秒を実行するために、次のいずれかをスケジュールします。

setTimeout(function(){ 
    process.stdout.write('\n\nJokes Apart !!!\n\n'); 
     // when the first timer fires, set a new timer to run the second 
     // part one second from when the first one fired 
     setTimeout(function(){ 
      process.stdout.write('\n\nLet\'s play a game !!!\n\n'); 
     }, 1000); 
}, 2000); 

この非ブロッキング特性は、Javascriptに非同期動作を与えるものです。最初のsetTimeout()を呼び出すと、Javascriptインタプリタは停止してタイマーが起動するのを待つだけではありません。代わりに、そのタイマーはいつか将来実行されるようにスケジュールし、残りのJavascriptを実行し続けます。あなたのコードでは、コードの次の行は別のsetTimeout()なので、すぐにそのタイマーもスケジュールします。両方とも同時に予定されていたので、今から2秒間予定されているものは、今から1秒間予定されているものの後に来るのが理にかなっています。

このように、2つの選択肢があります。 2つ目のタイマーをスケジュールするコードが基本的に同時に実行されている場合は、を変更することができます。 2番目のタイマーをスケジュールするまで、時間を変更することができます。最初のタイマーが起動した後。

1

何が起きているのかを理解するには、まずJSイベントループとそのノンブロッキングの性質を理解する必要があります。 https://blog.risingstack.com/node-js-at-scale-understanding-node-js-event-loop/を、またはあなたがビデオ形式を好むならば、これは素晴らしい話です:あなたがここでそれについて読むことができます簡単に言えばhttps://youtu.be/8aGhZQkoFbQ

、エンジンは、コードを通過する - それがために(最初setTimeout、それスケジュールに遭遇したとき2秒後)、のままです。次に、2番目のsetTimeoutが表示され、それもスケジュールされます。秒が過ぎると、2番目のsetTimeoutからのコールバックがトリガされて実行され、わずか1秒後に最初のコールバックがトリガされます。これがその順序でそれらを見る理由です。 -

は今、それを修正するすべてを行う必要があるだけで巣それらです:

これは最初のものからコールバックが実行されている場合のみ、スケジュールを取得するために第2の setTimeoutなり
setTimeout(function(){ 
    process.stdout.write('\n\nJokes Apart !!!\n\n'); 

    setTimeout(function(){ 
     process.stdout.write('\n\nLet\'s play a game !!!\n\n'); 
    }, 1000); 
}, 2000); 

関連する問題