0

別の関数がタスクを完了するまで関数を一時停止しようとしています。.ajaxComplete() に似たものはありますが、関数の完了のためですか?

このコードは、最初は「テスト」をすばやく出力し、その後速度を落とします (必要に応じて減速します)。ループ内の数値が大きくなると、setTimeout が長くなるため、ループが進むにつれて「遅く」出力されます。基本的に、関数が出力されるまでループを一時停止する必要があります。

編集 - コードを更新しました。「test」は一度だけ出力され、それ以外は何も起こりません。

 <html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js" type="text/javascript"></script>
</head>
<body>

<input type="button" value="Display alert box" onclick="docWrite()" />
<script>

var b = 0;

function docWrite() {
   document.write("test");
   timeMsg();
}

function timeMsg() {
  b += 250;
  if (b < 5000) { //check the limit
     setTimeout("docWrite()", b - 250); //substract 250 (because we already added 250 before the first print
  }
}
</script>
</body>
</html>
4

3 に答える 3

3

タイムアウト関数に新しいタイムアウト関数を開始させる方が良いと思います。これにより、問題が解決され、for ループが完全に取り除かれます。timeMsg() を呼び出すだけで、例を開始できます。

<script>

var b = 0;

function docWrite() {
    $('body').append("test");
    timeMsg();
}

function timeMsg() {
    b += 250;
    if (b < 5000) { //check the limit
        setTimeout(docWrite, b - 250); //substract 250 (because we already added 250 before the first print
    }
}

</script>

独自のスクリプトを変更すると、次のようになります。

<html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js" type="text/javascript"></script>
</head>
<body>

<input type="button" value="Display alert box" onclick="timeMsg()" />
<script>

var b = 0;

function docWrite() {
   $("body").append("test");
   timeMsg();
}

function timeMsg() {
  b += 250;
  if (b < 5000) { //check the limit
     setTimeout(docWrite, b - 250); //substract 250 (because we already added 250 before the first print
  }
}
</script>
</body>
</html>
于 2012-05-07T12:19:24.210 に答える
0

にコールバックを追加する必要がありますdocWrite()。関数を渡して、何か (または実行したいこと) を実行させます。

function docWrite(callback) {
    document.write('test');
    // something like
    callback();
}

次に、次のように構造化できます。

var b = 0;
function timeMsg(){
    var t = setTimeout(function () {
        docWrite(function () {
            // what to do after this finishes
            if (b > 5000) { return; }
            b += 250;
            timeMsg();
        })
    }, b);
}   
于 2012-05-07T12:19:52.727 に答える
0

次の関数を使用して、タスクを完了することができます。

function repeat(action, initial, slowdown, count, callback) {
    function next(time) {
       window.setTimeout(function() {
          if (count--) {
             action();
             next(time+slowdown);
          }
          else
             callback();
       }, time);
    }

    next(initial);
}

次のように使用できます。

repeat(docWrite, 0, 250, 5000/250, function() {
    $("body").append("done"); 
});

function docWrite(){
    $("body").append("test");
}​

actionコールバック ( docWrite) が非同期呼び出しを実行する場合 (次のタイマーを開始する前に完了するまで待機するアニメーション自体など) は、もう少し複雑になることに注意してください。その場合はお知らせください。

http://jsfiddle.net/JKEpK/4/

于 2012-05-07T12:23:03.693 に答える