2013-04-05 145 views
0

我有一个昂贵的函数createNewWindow()。我想在调用方法时显示进度指示器,然后在函数结束时隐藏该指示器。我尝试过的所有事情,除非方法已经完成,否则我没有看到进度指示器,所以我试图以同步方式调用该方法(和失败)。异步调用函数?

我尝试这样做:

​​

而且createNewWindow的最后一行是$( “#进步”)显示()。没有工作。在此之前,我尝试过:

$("#submit").click(function() { 
    $("#progress").show(); 
    setTimeout(createNewWindow(), 0); 
}); 

同样的效果。

什么是正确的方法来做到这一点?

我看到一些其他的SO帖子,如this描述使用setInterval或setTimeout,但我无法让他们像我期待的那样工作。

+0

以异步方式调用同步函数并不是如此。它仍然会阻止浏览器,你最好的选择是旋转的东西。 – adeneo 2013-04-05 23:16:05

回答

3

这是一个常见的错误。问题就在这里:

setTimeout(createNewWindow(), 0); 

这将立即拨打createNewWindow和结果(可能无效)传递给setTimeout。这不是你想要的,你想要的功能createNewWindow传递给setTimeout为它在以后的时间把它叫做:

setTimeout(createNewWindow, 0); 

注意缺少括号。您将createNewWindow(这是一个函数)的值传递给setTimeout,而不是调用它并传递其返回值。

这应该使进度条马上显示出来。但是,如果createNewWindow是一个非常昂贵的功能,并且会占用大量资源,那么仍然会减慢您的网页,因为您的所有JavaScript代码都运行在同一个线程中。在这种情况下,您可能需要考虑using a Worker

+0

这是一个很棒的结果,谢谢!不幸的是,它仍然没有得到正确显示的进展...可能是因为它是你在同一个线程中提到的。但是,我只看到了一些将js文件的URL加入的工作人员的例子?有没有办法用功能创建一个新的工人?也许和'新工人(createNewWindow)'一样简单? – Nicros 2013-04-05 23:33:28

+0

不,那没有工作:) – Nicros 2013-04-05 23:47:10