0

我试图暂停一个函数,直到另一个函数完成其任务。有什么类似于 .ajaxComplete() 但用于完成功能的东西吗?

这段代码应该首先快速打印出“测试”,然后减速(如果你愿意的话,减速)。随着循环中的数字变大, setTimeout 变长,因此,随着循环的进行,它会打印“更慢”。基本上,我需要循环暂停,直到函数打印出来。

编辑 - 我更新了我的代码。“测试”只打印一次,没有其他任何事情发生。

 <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 回答