回答:
提供するコールバック関数にコードを配置する必要がありますsetTimeout
。
function stateChange(newState) {
setTimeout(function () {
if (newState == -1) {
alert('VIDEO HAS STOPPED');
}
}, 5000);
}
他のコードはすぐに実行されます。
本当にこれを行うべきではありません。タイムアウトの正しい使用は、OPの問題や、一定期間後に何かを実行したい場合に適したツールです。ジョセフ・シルバーは彼の答えでそれをよく示しています。ただし、本番以外のケースで本当に時間の期間、メインスレッドをハングアップしたい、これはそれを行います。
function wait(ms){
var start = new Date().getTime();
var end = start;
while(end < start + ms) {
end = new Date().getTime();
}
}
次の形式で実行すると:
console.log('before');
wait(7000); //7 seconds in milliseconds
console.log('after');
私がここに到着したのは、長時間実行するブロッキング操作(つまり、高価なDOM操作)に関連する非同期操作の混合をシーケンスするための簡単なテストケースを作成していて、これが私のシミュレートされたブロッキング操作だからです。それはその仕事にぴったりなので、私は同様のユースケースでここに到着した他の人にそれを投稿すると思いました。それでも、whileループでDate()オブジェクトを作成しているため、GCが十分に長く実行されると、GCを非常に圧倒する可能性があります。しかし、十分に強調することはできません。これはテストにのみ適しています。実際の機能を構築するには、Joseph Silberの回答を参照してください。
これは、新しいasync / await構文を使用したソリューションです。
これはECMAScript 6で導入された新機能なので、ブラウザーのサポートを確認してください。
効用関数:
const delay = ms => new Promise(res => setTimeout(res, ms));
使用法:
const yourFunction = async () => {
await delay(5000);
console.log("Waited 5s");
await delay(5000);
console.log("Waited an additional 5s");
};
このアプローチの利点は、コードが同期コードのように見え、動作することです。
次のような遅延関数を使用します。
var delay = ( function() {
var timer = 0;
return function(callback, ms) {
clearTimeout (timer);
timer = setTimeout(callback, ms);
};
})();
使用法:
delay(function(){
// do stuff
}, 5000 ); // end delay
JavaScriptで5秒間一時停止しないでください。そのようには機能しません。コードの関数を5秒後に実行するようにスケジュールできますが、後で実行するコードを関数に入れ、その関数の残りのコードをすぐに実行し続ける必要があります。
例えば:
function stateChange(newState) {
setTimeout(function(){
if(newState == -1){alert('VIDEO HAS STOPPED');}
}, 5000);
}
しかし、次のようなコードがある場合:
stateChange(-1);
console.log("Hello");
console.log()
文はすぐに実行されます。stateChange()
関数でタイムアウトが発生するまで待機しません。JavaScriptの実行を所定の時間だけ一時停止することはできません。
代わりに、遅延を実行するコードは、setTimeout()
コールバック関数内にある(またはその関数から呼び出される)必要があります。
ループによって「一時停止」しようとした場合、基本的にはJavaScriptインタープリターを一定期間「ハング」させます。JavaScriptはコードを1つのスレッドでのみ実行するため、ループしているときは他に何も実行できません(他のイベントハンドラーを呼び出すことはできません)。したがって、変数が変更されるのを待ってループすることは、その変数を変更するために他のコードを実行できないため、機能しません。
var t = new Date().getTime(); while (new Date().getTime() < t + millisecondsToLockupBrowser);
あなたがいる場合は、非同期機能は、単に1行でそれを行うことができます。
console.log(1);
await new Promise(resolve => setTimeout(resolve, 3000)); // 3 sec
console.log(2);
お知らせ、ターゲットがNodeJSであれば、これを使用する方が効率的になります(それが事前に定義promisified setTimeout関数です):
await setTimeout[Object.getOwnPropertySymbols(setTimeout)[0]](3000) // 3 sec
ミリ秒単位で待機するこのような関数を作成する最良の方法です。この関数は、引数で指定されたミリ秒待機します。
function waitSeconds(iMilliSeconds) {
var counter= 0
, start = new Date().getTime()
, end = 0;
while (counter < iMilliSeconds) {
end = new Date().getTime();
counter = end - start;
}
}
ジョセフ・シルバーの答えに基づく、私はそのようにします、もう少し一般的です。
あなたはあなたの機能を持っています(質問に基づいて作成しましょう):
function videoStopped(newState){
if (newState == -1) {
alert('VIDEO HAS STOPPED');
}
}
そして、あなたは待機機能を持つことができます:
function wait(milliseconds, foo, arg){
setTimeout(function () {
foo(arg); // will be executed after the specified time
}, milliseconds);
}
最後に、次のようになります。
wait(5000, videoStopped, newState);
それは解決策です、私はむしろウェイト関数で引数を使用しないでください(foo();
代わりにを持つだけですfoo(arg);
)が、それは例のためです。
このソリューションは、React Nativeの更新コントロールに関するドキュメントに基づいています。
function wait(timeout) {
return new Promise(resolve => {
setTimeout(resolve, timeout);
});
}
これをOPの質問に適用するには、次の関数と連携してこの関数を使用できますawait
。
await wait(5000);
if (newState == -1) {
alert('Done');
}
関数(asyncとawait)に小さな変更を加えることで、遅延を追加できます。
const add5SecondsDelay = () => {
return new Promise(resolve => {
setTimeout(() => {
resolve('5 seconds');
}, 50000);
});
}
async function asyncFunctionCall() {
console.log("stpe-1");
const result = await add5SecondsDelay ();
console.log("step-2 after 5 seconds delay");
}
asyncFunctionCall();
新しいJs関数を作成する
function sleep(delay) {
var start = new Date().getTime();
while (new Date().getTime() < start + delay);
}
実行を遅らせたいときに関数を呼び出します。遅延値にはミリ秒をintで使用します。
####Some code
sleep(1000);
####Next line
エッジまたはIEからPCゲームを実行するために使用しました。そして、7秒後にIE Edgeを自動的に閉じます。
FirefoxとGoogle Chromeを使用して、この方法でゲームを開始することはできません。
<html<body>
<a href="E:\game\game.exe" name="game" onmouseout="waitclose(7000);"> game
<img src="game.jpg" width="100%" height="97%" ></a>
<script>
function waitclose(ms){
var start = new Date().getTime();var end=start;
while(end < start + ms) {end = new Date().getTime();}
window.open('', '_self', ''); window.close();
}
</script>
</body></html>