私はそれについて考えています、そしてこれは私が思いついたものです:
次のようなコードがあるとします。
console.clear();
console.log("a");
setTimeout(function(){console.log("b");},1000);
console.log("c");
setTimeout(function(){console.log("d");},0);
リクエストが届き、JSエンジンは上記のコードの実行を段階的に開始します。最初の2つの呼び出しは同期呼び出しです。しかし、setTimeout
メソッドに関しては、非同期実行になります。しかし、JSはすぐにそれから戻って、実行を継続する、と呼ばれていますNon-Blocking
かAsync
。そしてそれは他にも取り組んでいます。
この実行の結果は次のとおりです。
acdb
つまり、基本的には2番目setTimeout
が最初に終了し、そのコールバック関数は最初のものよりも早く実行され、それは理にかなっています。
ここではシングルスレッドアプリケーションについて説明します。JS Engineはこれを実行し続け、最初のリクエストが終了しない限り、2番目のリクエストには進みません。しかし良い点は、setTimeout
解決するようなブロック操作を待たないため、新しい着信要求を受け入れるため、処理が速くなることです。
しかし、私の質問は次の項目に関して発生します。
#1:シングルスレッドアプリケーションについて話している場合setTimeouts
、JSエンジンがより多くのリクエストを受け入れて実行する間に、どのメカニズムが処理しますか?シングルスレッドは他のリクエストに対してどのように機能し続けますか?何が上で動作しsetTimeout
、他の要求がでてくると実行を取得しています。
#2:これらのsetTimeout
関数がバックグラウンドで実行され、さらに多くのリクエストが入って実行されている場合、バックグラウンドで非同期実行を実行するものは何ですか?私たちが話しているこのことは何と呼ばれていEventLoop
ますか?
#3:しかし、メソッド全体をに入れEventLoop
て、全体が実行され、コールバックメソッドが呼び出されるようにしないでください。これは、コールバック関数について話すときに理解できることです。
function downloadFile(filePath, callback)
{
blah.downloadFile(filePath);
callback();
}
しかし、この場合、JSエンジンは非同期関数であるかどうかをどのようにして認識し、コールバックEventLoop? Perhaps something like the
をC#のasync`キーワードに入れるか、JSエンジンが行うメソッドが非同期メソッドであることを示す何らかの属性を置くことができます。それに応じて処理する必要があります。
#4:しかし、記事は、物事がどのように機能しているのかについて私が推測していたこととはまったく逆のことを言っています。
イベントループは、コールバック関数のキューです。非同期関数が実行されると、コールバック関数がキューにプッシュされます。JavaScriptエンジンは、非同期関数が実行された後のコードが実行されるまで、イベントループの処理を開始しません。
#5:この画像は参考になるかもしれませんが、画像の最初の説明は、質問番号4で述べたものとまったく同じことを言っています。
だから私の質問は、上記の項目についていくつかの説明を得ることですか?