JSには睡眠方法はありません。冬眠したい場合は、自分でメソッドを定義する必要があります。
function Sleep(numbermillis){var now = new date(); var exittime = now.gettime() + numbermillis; while(true){now = new date(); if(now.gettime()> exittime)return; }}以下は追加です:
物語のJSに加えて、JWACS(高度な継続的なサポートを備えたJavaScript)は、JavaScriptの構文を拡張することで非同期に呼び出されるコールバック関数の書き込みを避けるためにコミットしています。 JWACSで実装された睡眠、コードは次のとおりです。
コードコピーは次のとおりです。
機能スリープ(MSEC){
var k = function_continuation;
setimeout(function(){resume k <-mesc;}、msec);
つるす;
}
この構文はさらに怖く、Javaでは推奨されないスレッドメソッド名です。率直に言って、私は物語JSに向かう傾向があります。
物語のJSと同様に、JWACSも事前コンパイルする必要があり、PrecompilerはLisp Languageで書かれています。また、現時点ではアルファバージョンでもあります。 2つの紹介と比較については、SitePointの新しい記事を参照してください。
複雑なJavaScriptスクリプトを書くとき、スレッドで達成された効果と同様に、スクリプトが指定された期間にわたって失速できることを期待する必要があります。
誰もが知っているように、JavaScriptはJavaと同様のスレッド制御機能を提供しません。 SettimeOutとSetIntervalの2つの方法がありますが、タイミングのある実行制御を実行できますが、すべての要件を満たすことはできません。 JavaScriptで睡眠/一時停止/待機を実装する方法を尋ねる多くの人々が常にいました。
最も簡単で最悪の方法は、ループを書くことです。コードは次のとおりです。
コードコピーは次のとおりです。
機能スリープ(numbermillis){
var now = new date();
var exittime = now.gettime() + numbermillis;
while(true){
now = new date();
if(now.gettime()> exittime)
戻る;
}
}
上記のコードは実際にはスクリプトインタープリターをスリープすることはなく、CPUを高負荷に迅速に増加させる効果もあります。ブラウザは、その期間、偽の死の状態にさえあります。
第二に、賢い人はIEの特別なダイアログボックスの実装を使用して互いに接続します。コードは次のとおりです。
コードコピーは次のとおりです。
機能スリープ(タイムアウト){
window.showmodaldialog( "javascript:document.writeln( '<script> window.settimeout(function(){window.close();}、" + timeout + "); <// script>');");
} window.alert( "睡眠前...");
睡眠(2000);
window.alert( "睡眠後...");
言うまでもなく、IEはサポートしています(IE7はセキュリティの制限により目標を達成できません)。
さらに、アプレットの使用やWindows Script Hostのwscript.sleep()の呼び出しなどのトリックもあります。これらはすべて最後のリゾートです。
最後に、おそらく最良の解決策を開発したより賢い人がいます。最初にコードを見てみましょう:
コードコピーは次のとおりです。
機能スリープ(ミリス){
var notifier = njsruntime.createNotifier();
Settimeout(Notifier、Millis);
Notifier.Wait->();
}
そうです、 - >()の構文を見るのは、プロトタイプの$()関数を見るのは驚くべきことです。ただし、このスクリプトでは、構文エラーをブラウザに直接報告します。実際、クライアントブラウザによって承認されたJavaScriptに事前補完する必要があります。コンパイルされたスクリプトは次のとおりです。
コードコピーは次のとおりです。
機能スリープ(ミリス){
var njf1 = njen(これ、議論、「ミリス」);
NJ:while(1){
try {switch(njf1.cp){
ケース0:njf1._notifier = njsruntime.createnotifier();
setimeout(njf1._notifier、njf1._millis);
njf1.cp = 1;
njf1._notifier.wait(njf1);
戻る;
ケース1:NJを破る;
}} catch(ex){
if(!njf1.exect(ex、1))
戻る;
}}
njf1.pf();
}
私はそれを理解することができません、そして私はもうそれを理解したくありません。これらのタスクはすべて、ナラティブJavaScriptによって実装されます。これは、私たちに非同期ブロッキング機能を提供するJS拡張機能です。前に奇妙な - >()構文を書いてから、前景の前のコンピレーションまたはダイナミックな編集を通じて睡眠効果を実装するだけです。
物語のJavaScriptは、めまいのコールバック関数からあなたを解放し、明確な長期的なタスクを書くと主張しています。現在、それはまだアルファのバージョンであり、例のページに移動ボタンの例があります。ソースコードのダウンロードもホームページで入手できます。私の弱い基本的な知識により、状態マシンの実装がコードでシミュレートされていることをほとんど見ることができません。アルゴリズムに熟練した友人が私たちのためにそれを解析できることを願っています。
最後に、私は常に自分の見解を持っていました。必要な場合を除き、JavaScriptをシンプルにしてください。 JavaScriptがネイティブのスレッドサポートを提供する前に、おそらく非同期ブロッキングアプリケーションを避けるために設計を変更できます。
バグの曲がりくねった実装
<スクリプトタイプ「テキスト/javaScript」>/*JavaScriptの一時停止関数の実装JavaScript自体には、一時停止関数がありません(睡眠は使用できません)同時に、VBScriptはDoeventsを使用できないため、この関数を記述してこの関数を実装します。 JavaScriptは弱いオブジェクト言語であり、関数をオブジェクトとして使用することもできます。例:[code] function test(){alert( "hellow"); this.nextStep = function(){alert( "nextstep"); }} var mytest = new test()を呼び出すことができます。 mytest.nextStep();一時停止すると、関数を2つの部分に分割することができます。これは、一時停止操作の前に変更されず、このように一時停止した後にコードを実行します。一時停止と継続を制御するには、それぞれ一時停止と継続機能を実装するために2つの機能を記述する必要があります。一時停止関数は次のとおりです。 */function Pause(obj、iminsecond){if(window.eventlist == null)window.eventlist = new Array(); var ind = -1; for(var i = 0; i <window.eventlist.length; i ++){if(window.eventlist [i] = null){window.eventlist [i] = obj; ind = i;壊す; }} if(ind == -1){ind = window.eventlist.length; window.eventlist [ind] = obj; } setimeout( "Goon(" + ind + ")"、1000);}/*この関数は、アレイwindow.eventlistに関数を一時停止し、同時にSettimeoutを通じて継続関数を呼び出します。継続的な関数は次のとおりです。 window.eventlist [ind] = null; if(obj.nextStep)obj.nextStep(); else obj();}/*この関数は、中断された関数の次のステップ方式を呼び出します。この方法が利用できない場合、関数は再び呼び出されます。関数が記述された後、次のボリュームを書き込むことができます。 */function test(){alert( "hellow");一時停止(this、1000); //一時function this.nextstep = function(){alert( "nextstep"); }} </script>