2017-12-13 9 views
0

クライアント側のJavaScriptの実行を、指定されたミリ秒(例:sleep)のブロックを、ページ。不要な計算なしで一定期間JavaScriptをブロックする

待機中に何も起こらないでください。ページが読み込まれ続けるべきではありません。それは敏感ではありません。また、可能であれば1〜10ミリ秒の精度が必要です。待ち時間は1000ミリ秒を超えることがあります。

この問題の標準的な「解決策」は、通常はやりたいことではないので、別の質問をすることです。あなたが通常したいことは、await Promise.delay(1000)の行に沿った何かです。

私はこれを行うことの問題を十分に認識しており、ほとんどすべての状況で恐ろしいアイデアだと完全に認識していますが、それでもやる必要があります。あなたの魂を楽にするために、このページはヘッドレスブラウザでのみ使用されるため、このハッキングの実行にユーザーが害を受けることはありません。問題へ

実際のソリューションは次のようになります。非常にうまく機能し

while (expectedTime > Date.now()) { } 

。しかし、私がしたいのは、イベントループにのストップを伝えるだけで、たくさんの不要な計算を行うという副作用があります。

私は、ページが100msの最初の数秒間にいくつかの同期I/Oを実行し、上記の方法に頼るように強制するかもしれないと思うが、これを達成する方法がわからない。それが役に立ったら、私もサーバーを使うことができます。

+0

WEB Javascriptのコンテキストは、アイドル状態とCPUサイクルを節約するために、内部イベントループを置く利用できる機能のような何の「スリープ」を持っていません。あなたのウェブページが待つべき理由は何ですか? – Stphane

答えて

-1

async/await構文を試してみてください。

async function stop_fn() { 
 
    var a = 99999999 
 
    var b = 11111111 
 
    console.log('hello there') 
 

 
    //This will stop the execution without CPU blocking 
 
    await new Promise(next=> setTimeout(()=> next(), 4000)) 
 

 
    console.log('After 4000ms', a) 
 

 
    //Another 4000ms stop 
 
    await new Promise(next=> setTimeout(()=> next(), 4000)) 
 
    console.log('after 4000ms more, please stop it', b) 
 

 
    return 'end of this' 
 
} 
 
stop_fn()

+0

これはかなり遅れていますが、これはうまくいかないでしょう。私は質問で言及したように、イベントループをブロックしたい。私は実際に私のためにはうまくいかないものとして、この種のものを言及しました。 – GregRos

+0

その後、イベントループをブロックしたい場合はN秒間無限のwhileを使用しますが、それは意味をなさないでしょう。 –

+0

答える前に、次回から最後までお読みください。私はこれが通常は意味をなさないものだと繰り返し言いますが、とにかくそれをやる必要があります。私は実際には可能な解決策の例としてwhileループを与えていますが、私はこの問題が不必要な計算であることを何度も述べています。 – GregRos

-1
//random blocking function 
function blockCpu(ms) { 
    var now = new Date().getTime(); 
    while(true) {  
     if (new Date().getTime() > now +ms) 
      return; 
    } 
} 
+0

これは私が質問で述べた*正確なものです。私はあなたがこれを行うことができることをすでに知っています私はより良いものを求めた。これは、CPUの長期化を招き、他のプロセスを傷つけるためです。 – GregRos

関連する問題