使用javascript/jquery检查函数是否已完成其任务

使用javascript/jquery检查函数是否已完成其任务,javascript,jquery,Javascript,Jquery,我试图暂停一个函数,直到另一个函数完成它的任务。除了函数的完成,还有什么类似于.ajaxComplete()的吗 这段代码应该首先快速打印出“test”,然后再减速(如果愿意的话,可以减速)。随着循环中的数字变高,setTimeout变长,因此,它在循环进行时打印“较慢”。基本上,我需要循环暂停,直到函数打印出来 编辑-我更新了我的代码。“测试”只打印一次,其他情况不会发生 <html> <head> <script src="http://ajax.google

我试图暂停一个函数,直到另一个函数完成它的任务。除了函数的完成,还有什么类似于.ajaxComplete()的吗

这段代码应该首先快速打印出“test”,然后再减速(如果愿意的话,可以减速)。随着循环中的数字变高,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>

var b=0;
函数docWrite(){
文件。编写(“测试”);
timeMsg();
}
函数timeMsg(){
b+=250;
如果(b<5000){//检查限值
setTimeout(“docWrite()”,b-250);//减250(因为我们在第一次打印之前已经添加了250
}
}

我认为最好让超时函数启动一个新的超时函数 这将解决您的问题,并完全摆脱for循环

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

var b=0;
函数docWrite(){
$('body')。追加(“test”);
timeMsg();
}
函数timeMsg(){
b+=250;
如果(b<5000){//检查限值
setTimeout(docWrite,b-250);//减去250(因为我们在第一次打印之前已经添加了250
}
}
修改您自己的脚本我最终会得到以下结果:

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

var b=0;
函数docWrite(){
$(“正文”)。附加(“测试”);
timeMsg();
}
函数timeMsg(){
b+=250;
如果(b<5000){//检查限值
setTimeout(docWrite,b-250);//减去250(因为我们在第一次打印之前已经添加了250
}
}

我认为最好让超时函数启动一个新的超时函数 这将解决您的问题,并完全摆脱for循环

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

var b=0;
函数docWrite(){
$('body')。追加(“test”);
timeMsg();
}
函数timeMsg(){
b+=250;
如果(b<5000){//检查限值
setTimeout(docWrite,b-250);//减去250(因为我们在第一次打印之前已经添加了250
}
}
修改您自己的脚本我最终会得到以下结果:

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

var b=0;
函数docWrite(){
$(“正文”)。附加(“测试”);
timeMsg();
}
函数timeMsg(){
b+=250;
如果(b<5000){//检查限值
setTimeout(docWrite,b-250);//减去250(因为我们在第一次打印之前已经添加了250
}
}

您必须将回调添加到
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);
}   

您必须将回调添加到
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);
}   

以下功能可用于完成您的任务:

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");
}​
请注意,如果
操作
回调(
docWrite
)执行异步调用,例如动画本身,您希望在启动下一个计时器之前等待完成,那么它会变得有点复杂。如果是这种情况,请告诉我


以下功能可用于完成任务:

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");
}​
请注意,如果
操作
回调(
docWrite
)执行异步调用,例如动画本身,您希望在启动下一个计时器之前等待完成,那么它会变得有点复杂。如果是这种情况,请告诉我


您应该避免使用全局变量。这会使您的代码更难理解。
//在docWrite完成之前暂停循环的操作不可能以您希望的方式进行。
除了极少数例外,JS中不能有阻塞调用。您需要使用回调函数来设置在同步操作已完成。
//在docWrite完成之前暂停循环的某项操作
——这将冻结浏览器,并且inacceptable@zerkms~z~不太可能;我可以想出一些你想要阻止的原因。不过,我听到你说的,一般来说是这样。哦,你可能会想检查你的for循环语法。这是一个很好的例子无限循环。您应该避免使用全局变量。这会使您的代码更难理解。
//在docWrite完成之前暂停循环的操作不可能以您希望的方式进行。
。除极少数例外情况外,JS中不能有阻塞调用。您需要使用回调函数来设置需要运行的操作呃,异步操作已完成。
//在docWrite完成之前暂停循环的某些操作。
——这将冻结浏览器并停止inacceptable@zerkms~z~不太可能;我能想到一些你想要阻止的原因。不过,我听到你说的,一般来说是这样。哦,你可能会想检查你的for循环语法。这真是一个麻烦一个无限循环。看这一点是有道理的,但我无法让它工作。我将用整个html页面更新上面的代码setTimeout(“docWrite()”,b-250)应该替换为setTimeout(docWrite,b-250)。此外,您还忘了“var b=0;”:)。让您的脚本在chrome中使用这些修复程序。我在firefox和IE中尝试过,但都没有成功。只显示一次“测试”。在setTimeout中,如果我将docWrite更改为docWrite(),所有20个“测试”都会立即显示。而不是document.write(“测试”)使用$('body')。append(“测试”);document.write将替换整个文档。是的,timeMsg()函数在设置超时后结束。当超时发生时,系统将调用docwrite()函数。(换句话说,它不是递归的)。从这个角度看,这是有道理的,但我无法让它工作。我将用整个html页面更新上面的代码