非同期に関数を実行したい場合、私たちが考える最初の方法は間違いなくSetimeOutになるでしょう
例:settimeout(function(/* 1s*/){}の後に何かをします)、1000}
では、機能を非同期に最速で実行したい場合はどうなりますか?
それは次のとおりです:
setimeout(function( /*できるだけ早く何かをする* /){}、0}残念ながら、Settimeout NestのUIスレッドを妨害する可能性を回避するために、ブラウザはSettimeOutの最小実行時間間隔を設定し、異なるブラウザの最小実行時間間隔は異なります。 ChromeのSettimeOut0の実際の実行時間間隔は約12msです。
それで、可能な限り非同期に関数を実行したい場合、スピードアップする方法はありますか?
ブラウザ側を見てみましょう。一般的に使用される非同期実行方法は何ですか
Setimmediate:この方法では、SettimeOut0よりも速く非同期実行を実装し、実行時間は0msに近くなりますが、IE/ノードのみがサポートしています。
RequestAnimationFrame:この方法は、アニメーションループを実行するときによく使用されます。このメソッドは、ブラウザがUIを更新したときにのみ実行されます。 UIを更新する最大頻度は一般に60fpsなので、requestAnimationFrameは一般にSettimeOut0よりも遅くなります。
非同期関数の使用に加えて、非同期呼び出しを実装できる方法がいくつかあります。
onmessageを使用してください:
iframesと通信するとき、ムサージの方法がよく使用されますが、同じウィンドウポストメッサージがそれ自体に与えられた場合はどうなりますか?実際、それは非同期に関数を実行するのと同等です
例えば:
var dosth = function(){} window.addeventlistener( "message"、dost、true); window.postmessage( ""、 "*");さらに、スクリプトタグを使用して、次のような関数の非同期実行を実装することもできます。
VAR Newscript = document.CreateElement( "Script"); nughtcript.Onreadystatechange = dosth; document.documentelement.appendchild(newscript);
ドキュメントにスクリプトを追加すると、onreadystatechangeも実行されますが、この方法はIEのブラウザーでのみ使用できます。
では、これらの方法で最も速いのは誰ですか?
テストしました、
Chromeの下:
Setimmediate:利用できません。
SettimeOut 0:12ms
オンメサージ:6ms
onreadystatechange:サポートされていません
Chromeの下では、OnmessageはSettimeOut0よりも高速です。
Firefox:
Setimmediate:利用できません。
SetimeOut 0:7ms
オンメサージ:7ms
onreadystatechange:サポートされていません
Firefoxの下では、OnmessageとSetimeOut0は同じ速度です。
IE9:
Setimmediate:利用できません。
SettimeOut 0:11ms
オンメサージ:7ms 10ms
onreadystatechange:2ms
IE9では、時間が他の2つよりもはるかに高速です。
全体として、setimmediate <readystatechange <onmessage <setimeout0 <requestanimationframe
したがって、非同期関数をすばやく実行する方法を単純にカプセル化できます。
var setzerotimeout =(function(){if(window.setimmediate){// ie10+バージョン、ネイティブsetimmediatereturn window.setimmediate;} else if( "onedeadedstatechange" in document.createelement( "script")){return function(){/* returntechange*/} {/* version if() function(){/* onmessage*/}} elseを使用して{return window.settimeout;}})()();