在继续循环之前完成一个函数的运行
我希望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");
};
至于说注释,JavaScript不能做到这一点在一个循环中,因为fadeIn
,delay
和fadeOut
都是异步的。
像这样的东西应该工作:
function showNextQuote(n) {
if (n > 0) {
$("#quotes").fadeIn(2000).delay(2000).fadeOut(2000, function() {
alert("Lucky you");
showNextQuote(n - 1);
});
}
}
showNextQuote(4);
嗨,谢谢你的输入。不幸的是,警报仅在文本淡出4次后出现。每当它消失时,我都想让它警觉。我想这是你异步的意思。不过谢谢。我只会尝试别的。 – 2014-10-06 03:54:35
啊。误读您的代码。我会在一秒钟之内改变它。 – 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
调用该函数。
嗨,感谢您的输入。不幸的是,警报仅在文本淡出4次后出现。每当它消失时,我都想让它警觉。我想这是你异步的意思。不过谢谢。我只会尝试别的。 – 2014-10-06 03:55:01
@TommyNg:在这种情况下,将警报放在递归部分而不是终止条件部分。 – David 2014-10-06 09:41:43
@TommyNg:为了以防万一,我更新了我的答案中的代码以反映这一点。请注意,浏览器的'alert'是一个阻塞操作,所以下一个淡入和淡出将会等到您解除'alert'。我的答案中更新后的代码将显示淡出后的“提醒”。如果您想在淡入之前将其显示出来,只需将其移至调用'fadeIn()'之上即可。 – David 2014-10-06 11:54:33
这不是JavaScript的工作原理。你需要为此使用回调,你不能使用循环。 – Amadan 2014-10-06 00:48:03
“延迟”在异步操作中,你不能这样做。你可以做的是将一个回调传递给'fadeOut',以便在完成时执行。 – elclanrs 2014-10-06 00:48:19
对不起elclanrs,你能写出代码,以便我更好地理解吗? – 2014-10-06 00:49:23