我有一个昂贵的函数,createNewWindow()。我想在调用方法时显示进度指示器,然后在函数完成时隐藏该指示器。不过,我尝试过的所有方法,在该方法完成之前我都看不到进度指示器,因此我尝试异步调用该方法(并且失败)。
我尝试过这个:
$( "#submit" ).click( function () {
$("#progress").show();
$.Deferred(createNewWindow());
} );
createNewWindow 的最后一行是 $("#progress").show()。没用。在此之前我尝试过:
$( "#submit" ).click( function () {
$("#progress").show();
setTimeout(createNewWindow(), 0);
} );
效果相同。
正确的做法是什么?
我看到了其他一些帖子,例如 this描述了使用 setInterval 或 setTimeout,但我无法让它们像我预期的那样工作。
最佳答案
这是一个常见的错误。问题就在这里:
setTimeout(createNewWindow(), 0);
这将立即调用createNewWindow
并将结果(可能为空)传递给setTimeout
。这不是您想要的,您希望将 函数 createNewWindow
传递给 setTimeout
以便它稍后调用它:
setTimeout(createNewWindow, 0);
注意缺少的括号。您将createNewWindow
(这是一个函数)的值传递给setTimeout
,而不是调用它并传递其返回值。
这应该会使进度条立即显示。但是,如果 createNewWindow 是一个消耗大量资源的非常昂贵的函数,它仍然会减慢您的网页,因为所有 JavaScript 代码都在同一线程中运行。在这种情况下,您可能需要考虑 using a Worker
.
关于javascript - 异步调用函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15845092/