6

私はjavascriptでこのようなものが欲しいです。

for (i = 0; i < 10; i++) {
    alert(i);
    // now sleep 1 sec
    sleep(1000);
}

これにはJavascriptまたはJqueryが組み込まれていますか?

ありがとうございました!

4

8 に答える 8

5

直接、そんなことはありません。しばらく使用した後、javascriptに「何か」を起こすように指示する必要がありますsetTimeout

もちろん、この「何か」は、スリープに実行する予定のコードです。

インターネットで見つけた例から:

function dothingswithsleep( part ) {
    if( part == 0 ) {
        alert( "before sleep" );
        setTimeout( function() { dothingswithsleep( 1 ); }, 1000 );
    } else if( part == 1 ) {
        alert( "after sleep" );
    }
}

しかし、それは壊れやすい設計です。ビジネス ロジックを再考して、1 秒後に実際に何かを実行することをお勧めします。これらの不自然なヘルパー変数を使用する代わりに、別の関数を呼び出します。

于 2009-08-14T10:26:33.860 に答える
2

最初の質問、なぜあなたはループ内で眠りたいのですか?これが必要な場合は、おそらくイベントシステムを導入する必要があります。私自身、マルチスレッドのJavaScriptプログラミングでスリープ戦術を何度も試しましたが、うまく機能しないことがわかりました。javascriptでマルチスレッドを実行する最良の方法は、YUIまたは他のほとんどすべてのフレームワークによって提供されるようなイベントシステムを使用することです。リスナーにこのイベントをサブスクライブさせ、イベントが発生するたびに何かを実行してもらいます。これらのイベントフレームワークでは、独自のカスタムイベントがいつ発生するかを完全に制御できるため、大したことはありません。

YUIのイベントフレームワークへのリンクは次のとおりです。

http://developer.yahoo.com/yui/examples/event/index.html

YUIを使用してコーディングする方法は次のとおりです。

var myEvent = new YAHOO.util.CustomEvent('fooEvent');
// subscribe a function to be called (first param) inside the scope of an object
// (second param).
myEvent.subscribe(function() {alert(this.count++);},{count:0},true);
setTimeout('myEvent.fire()',1000);

その方法は、はるかにクリーンでコンパクトです。または、イベントフレームワークを使用したくない場合は、これを試してください

var myObj = {
    count:0,
    doSomething:function(){alert(this.count++);}
    loopFunc:function(){
        this.doSomething();
        setTimeout('myObj.loopFunc()',1000);
    }
}

それはあなたが必要とするものを提供し、そしてそのよりコンパクトです。

ただし、コードにスリープ関数が本当に必要な場合は、単純なサーバーサイドスクリプトに対して同期ajax呼び出しを行うことをお勧めします。次に、必要に応じて、サーバー上のコードを使用してスリープ状態にすることができます。以下は、同期呼び出しを行う方法を示す、ここに投稿された質問へのリンクです。

jQueryに非同期ではなく同期のAjaxリクエストを実行させるにはどうすればよいですか?

ただし、setTimeoutの方法を使用することを強くお勧めします。はるかにクリーンであり、回避できる場合はサーバーサイド呼び出しを行いたくないでしょう。

于 2009-08-14T10:42:06.417 に答える
2

私はjavascriptのスリープ/待機に関するかなりの数のWebページを検索/グーグルで検索しました...そして、javascriptを「RUN、DELAY、RUN」にしたい場合、答えはありません...ほとんどの人が得たのは、「RUN、RUN(役に立たないstuff), RUN" または "RUN, RUN + 遅れた RUN"....

だから私はいくつかのハンバーガーを食べて考えました:::これはうまくいく解決策です...しかし、実行中のコードを切り刻む必要があります...:::

//...................................................... //example1:

<html>
<body>
<div id="id1">DISPLAY</div>

<script>
//javascript sleep by "therealdealsince1982"; copyrighted 2009
//setInterval
var i = 0;

function run() {
    //pieces of codes to run
    if (i==0){document.getElementById("id1").innerHTML= "<p>code segment "+ i +" is ran</p>"; }
    if (i==1){document.getElementById("id1").innerHTML= "<p>code segment "+ i +" is ran</p>"; }
    if (i==2){document.getElementById("id1").innerHTML= "<p>code segment "+ i +" is ran</p>"; }
    if (i >2){document.getElementById("id1").innerHTML= "<p>code segment "+ i +" is ran</p>"; }
    if (i==5){document.getElementById("id1").innerHTML= "<p>all code segment finished running</p>"; clearInterval(t); } //end interval, stops run
    i++; //segment of code finished running, next...
}

t=setInterval("run()",1000);

</script>
</body>
</html>

//................................................. //example2:

<html>
<body>
<div id="id1">DISPLAY</div>

<script>
//javascript sleep by "therealdealsince1982"; copyrighted 2009
//setTimeout
var i = 0;

function run() {
    //pieces of codes to run, can use switch statement
    if (i==0){document.getElementById("id1").innerHTML= "<p>code segment "+ i +" ran</p>"; sleep(1000);}
    if (i==1){document.getElementById("id1").innerHTML= "<p>code segment "+ i +" ran</p>"; sleep(2000);}
    if (i==2){document.getElementById("id1").innerHTML= "<p>code segment "+ i +" ran</p>"; sleep(3000);}
    if (i==3){document.getElementById("id1").innerHTML= "<p>code segment "+ i +" ran</p>";} //stops automatically
    i++;
}

function sleep(dur) {t=setTimeout("run()",dur);} //starts flow control again after dur

run(); //starts flow
</script>
</body>
</html>
于 2009-11-10T06:01:08.580 に答える
1

「setTimeout を使ってみましたが、継続関数は必要ありません」というコメントを見て、はい、そうだと思いました。必要のないのはループです。再帰関数が必要です。

これ

for (i = 0; i < 10; i++) {
    alert(i);
    // now sleep 1 sec
    sleep(1000);
}

これに変換

function recursive( i, max )
{
    if ( i > max ) return;
    alert( i );
    i = i + 1;
    setTimeout( function(){ recursive(i, max); }, 1000 );
}

recursive(1, 10);

例: http://jsfiddle.net/q76Qa/

于 2013-12-12T22:00:32.537 に答える
0
function sleep(delay) { 
    var start = new Date().getTime(); 
    while (new Date().getTime() < start + delay); 
} 
于 2010-03-08T16:49:32.443 に答える
0

まあ、ウェブサーバーにPHPがインストールされている場合は、$.loadまたは同様のものを使用して、その中にのみ含まれるPHPファイルを呼び出すことができますsleep(int)...

于 2011-06-28T15:22:01.433 に答える
0

これは、Typescript を使用することで、最近ではより簡単に達成できます。

function delay(ms: number) {
    return new Promise( resolve => setTimeout(resolve, ms));
}

使用法 (非同期関数内):

await delay(1000);

例:

https://codepen.io/britsymate/pen/OJRdORX

于 2021-01-18T12:21:01.170 に答える