2016-11-16 18 views
1

setTimeOut()を今から10秒後に呼び出すと、長時間実行されているコマンドのセットを実行すると、それらのコマンドが関数セットの実行を終了するまでNode.js/JavaScriptは待機しますsetTimeOut? setInterval()で同じことが起こりますか?ノード内のsetTimeOut()とsetInterval()

setTimeOut()とsetInterval()の両方が同じ時刻に実行される可能性のあるコードで訴えていることがありますか?

私はnode-cron(https://github.com/kelektiv/node-cron/blob/master/lib/cron.js)ライブラリを使用していますが、setTimeOutを使用しています。私はsetInterval()を使っていくつかのタスクを追加しようとしています。

+0

JavaScriptコードが単一のスレッドで実行されるという事実を強調したいだけです。あなたの懸念は本当に曖昧なので、私は本当に何か他のことを言いません。 – tcooc

+0

@tcoocがシングルスレッド化されていても、「Node.js/JavaScriptはコマンドの実行が完了するまで待つ」という答えは意味がありません – zerkms

+0

@Alejandro、ありがとうございましたが、その質問のsetInterval() 。 – user994165

答えて

0

答えは多分ですが、おそらくそうではありません。

物事が非同期である場合、必ず何が呼び出されるのか保証されません。非同期のものが呼び出されると、内部のキューに追加され、キューを処理します。確かに、彼らは終わるでしょうが、それはあなたが頼りにするべきではありません。

代わりに、完了したことを明示的に示すものをトリガする必要があります。コールバックやPromisesなど、さまざまな方法があります。依存ステップの前に状態を示すブール値を設定してチェックすることもできます。

let aDone = false; 

setTimeout(() => { aDone = true; }, 1000); 

const startInterval =() => { 
    if (!aDone) { 
     setTimeout(startInterval, 200); // try again in 200ms 
    } 

    setInterval(() => { /* do something */ }, 1000); 
}; 

startInterval(); // kick off the interval check 
+0

"それはあなたが頼りにするべきものではありません" ---これはどういう意味ですか?それは終わるかどうか? – zerkms

+0

@zerkmsそれは、それが完了するかどうかを確かめることができないことを意味するので、確実性が必要な場合は別のメカニズムを使用してください。 –

+0

@zerkms基本的に、あなたはそれを信じることはできません。 10回のテストのうち9回は機能しますが、1回は機能しません。それは競争状態です。 (編集はWikiをチェックアウトするための推奨を削除するために編集してください!= OP) – samanime

2

node.jsのタイマーイベントは、正確な時刻に呼び出されることが保証されていません。

私は今から10秒、と言うのためのsetTimeout()を呼び出した場合、それらの コマンドはsetTimeoutメソッドで設定した機能の実行を終了するまで、その後、長時間実行されるコマンドの セットを実行、Node.jsの/ JavaScriptが待っていますか?

はい、次のタイマーイベントを処理する前に、node.jsで実行されている現在のコードが完了するまで待機します。

setInterval()も同じですか?

はい、setInterval()と同じメカニズムです。

ここで、node.jsシステムの仕組みについて説明します。

node.jsはシングルスレッドのイベント駆動型システムです(技術的にはスレッドはnode.js内で使用されますが、JSコードの1つのスレッドのみを実行します)。

setTimeout()またはsetInterval()を使用すると、node.jsの内部メカニズムによって、システムタイマーが次のタイマーの起動タイミングを知るために使用されます。その時点で、イベントがnode.jsイベントキューに挿入されます。その時点でnode.jsが何もしていない場合、イベントはすぐにトリガーされ、適切なコールバック関数がただちに呼び出されます。

node.jsが実行中のコードで、他のイベントがイベントキューのタイマーイベントの前にある場合、タイマーイベントはすぐにはトリガーされません。

代わりに、node.jsは、node.js内の現在の実行スレッドが完了するまで待ってから、イベントキュー内の次のイベントが取り出され、そのイベントの適切なコールバックが取得されますと呼ばれる。

長時間実行しているnode.jsコードがあると、それは完了するまで他のすべてのイベント(タイマーイベントを含む)をブロックし、node.jsはイベントから次のイベントを引き出すことに戻りますキュー。

+1

@zerkms - あなたは見ませんでしたか? "node.jsはシングルスレッドのイベント駆動型システム"の直後に来る答えです。 "(技術的にはスレッドはnode.jsの内部で使用されますが、JSコードのスレッドは1つしか実行されません) ? – jfriend00

+0

私は確かにありません。どのように私はそれを見ていない良い説明がありませんo_O – zerkms

+1

@それは編集として追加されましたが、投稿の直後にあなたのコメントの前に追加されました。ですから、編集前にバージョンを表示していた可能性があります。 – jfriend00

関連する問題