我只找到了涉及类、事件处理程序和回调的相当复杂的答案(在我看来,这似乎是一种大锤方法)。我认为回调可能是有用的,但我似乎无法在最简单的上下文中应用这些回调。请参阅此示例:
<html>
<head>
<script type="text/javascript">
function myfunction() {
longfunctionfirst();
shortfunctionsecond();
}
function longfunctionfirst() {
setTimeout('alert("first function finished");',3000);
}
function shortfunctionsecond() {
setTimeout('alert("second function finished");',200);
}
</script>
</head>
<body>
<a href="#" onclick="javascript:myfunction();return false;">Call my function</a>
</body>
</html>
在这种情况下,第二个函数在第一个函数之前完成;最简单的方法是什么(或者有这样的方法?)强制第二个函数延迟执行,直到第一个函数完成?
-编辑
因此,这是一个垃圾示例,但感谢David Hedlund,我在这个新示例中看到它确实是同步的(以及在测试过程中使我的浏览器崩溃!):
<html>
<head>
<script type="text/javascript">
function myfunction() {
longfunctionfirst();
shortfunctionsecond();
}
function longfunctionfirst() {
var j = 10000;
for (var i=0; i<j; i++) {
document.body.innerHTML += i;
}
alert("first function finished");
}
function shortfunctionsecond() {
var j = 10;
for (var i=0; i<j; i++) {
document.body.innerHTML += i;
}
alert("second function finished");
}
</script>
</head>
<body>
<a href="#" onclick="javascript:myfunction();return false;">Call my function</a>
</body>
</html>
因为我的实际问题是jQuery和IE,如果我自己不能到达任何地方,我将不得不发布一个关于这个问题的单独问题!
发布于 2013-08-20 20:23:27
经过这么长时间后,我又回到了这个问题上,因为我花了那么长时间才找到一个我认为是干净的解决方案:据我所知,强制执行javascript顺序执行的唯一方法就是使用promises。有关承诺的详细说明,请访问:Promises/A和Promises/A+
我所知道的唯一实现promises的库是jquery,所以下面是我如何使用jquery promises来解决这个问题:
<html>
<head>
<script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
<script type="text/javascript">
function myfunction()
{
promise = longfunctionfirst().then(shortfunctionsecond);
}
function longfunctionfirst()
{
d = new $.Deferred();
setTimeout('alert("first function finished");d.resolve()',3000);
return d.promise()
}
function shortfunctionsecond()
{
d = new $.Deferred();
setTimeout('alert("second function finished");d.resolve()',200);
return d.promise()
}
</script>
</head>
<body>
<a href="#" onclick="javascript:myfunction();return false;">Call my function</a>
</body>
</html>
通过实现promise并使用.then()链接函数,您可以确保第二个函数仅在第一个函数执行之后才会执行。正是longfunctionfirst()中的d.resolve()命令发出了启动下一个函数的信号。
从技术上讲,短函数sorry ()不需要创建一个延迟并返回一个promise,但是我爱上了promise,并且倾向于用promise来实现一切,抱歉。
发布于 2009-12-07 18:42:38
在javascript中,没有办法让代码等待。我遇到过这个问题,我的解决方法是对服务器执行一个同步的SJAX调用,服务器实际上在返回之前执行睡眠或做一些活动,整个过程中,js都在等待。
同步AJAX的Eg:http://www.hunlock.com/blogs/Snippets:_Synchronous_AJAX
发布于 2009-12-07 18:50:38
在您的示例中,第一个函数实际上在第二个函数启动之前完成。setTimeout在超时之前不会暂停函数的执行,它只会在后台启动一个计时器,并在指定的时间之后执行您的警报语句。
在JavaScript中没有本机的“睡眠”方式。您可以编写一个循环来检查时间,但这会给客户端带来很大的压力。您也可以像emacsian描述的那样进行同步AJAX调用,但这会给服务器带来额外的负载。你最好的办法就是避免这种情况,一旦你理解了setTimeout的工作原理,这对于大多数情况来说应该是足够简单的。
https://stackoverflow.com/questions/1859185
复制相似问题