在继续循环之前完成一个函数的运行

问题描述:

我希望FOR循环中的函数能够在继续执行下一个代码之前完成运行,但我无法让它正常工作。在继续循环之前完成一个函数的运行

在弹出警告窗口'Lucky you'之前,它应该淡入淡出文本“Result”,但在看到文本之前我会先看到警告窗口循环。我不知道我做错了什么。

HTML: 
<div id="quotes" style="display: none;">Result</div> 

Javascript: 
function showNextQuote() { 
    $("#quotes").fadeIn(2000).delay(2000).fadeOut(2000); 
} 

for (i = 1; i < 4; i++){ 
    showNextQuote(); alert("Lucky you"); 
}; 
+1

这不是JavaScript的工作原理。你需要为此使用回调,你不能使用循环。 – Amadan 2014-10-06 00:48:03

+0

“延迟”在异步操作中,你不能这样做。你可以做的是将一个回调传递给'fadeOut',以便在完成时执行。 – elclanrs 2014-10-06 00:48:19

+0

对不起elclanrs,你能写出代码,以便我更好地理解吗? – 2014-10-06 00:49:23

至于说注释,JavaScript不能做到这一点在一个循环中,因为fadeIndelayfadeOut都是异步的。

像这样的东西应该工作:

function showNextQuote(n) { 
    if (n > 0) { 
    $("#quotes").fadeIn(2000).delay(2000).fadeOut(2000, function() { 
     alert("Lucky you"); 
     showNextQuote(n - 1); 
    }); 
    } 
} 
showNextQuote(4); 
+0

嗨,谢谢你的输入。不幸的是,警报仅在文本淡出4次后出现。每当它消失时,我都想让它警觉。我想这是你异步的意思。不过谢谢。我只会尝试别的。 – 2014-10-06 03:54:35

+0

啊。误读您的代码。我会在一秒钟之内改变它。 – Amadan 2014-10-06 03:55:21

由于这些操作都是异步的,而他们正在运行,你不能阻止处理。相反,你传给它们一个函数在完成时执行(称为回调函数)。因此,像这样链接它们看起来更像循环的递归函数。

(虽然这不是真的技术上递归由于异步操作不建立一个堆栈。这是语义/逻辑非常相似,尾递归不过,至少在功能结构。)

东西像这样:

function showNextQuote(iteration) { 
    // terminating condition 
    if (iteration > 4) { 
    return; 
    } 

    // recurse 
    $("#quotes").fadeIn(2000).delay(2000).fadeOut(2000, function() { 
    alert("Lucky you"); 
    showNextQuote(iteration + 1); 
    }); 
} 

showNextQuote(1); 

这样做是定义函数,其内部通过作为回调来fadeOut到本身的引用。每个回调将iteration值增加1.然后,在定义该函数之后,使用初始迭代值1调用该函数。

+0

嗨,感谢您的输入。不幸的是,警报仅在文本淡出4次后出现。每当它消失时,我都想让它警觉。我想这是你异步的意思。不过谢谢。我只会尝试别的。 – 2014-10-06 03:55:01

+0

@TommyNg:在这种情况下,将警报放在递归部分而不是终止条件部分。 – David 2014-10-06 09:41:43

+0

@TommyNg:为了以防万一,我更新了我的答案中的代码以反映这一点。请注意,浏览器的'alert'是一个阻塞操作,所以下一个淡入和淡出将会等到您解除'alert'。我的答案中更新后的代码将显示淡出后的“提醒”。如果您想在淡入之前将其显示出来,只需将其移至调用'fadeIn()'之上即可。 – David 2014-10-06 11:54:33