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番目のタイマーをスケジュールするまで、時間を変更することができます。最初のタイマーが起動した後。