javascript - 异步调用函数?

标签 javascript jquery asynchronous

我有一个昂贵的函数,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/

相关文章:

javascript - XMLHttpRequest 在保存时加载到调用对象

javascript - Stripe.js 提示被包含两次

javascript - 如何将特定值返回给对象的任何属性或函数调用?

javascript - 访问所有局部变量

javascript - 在正则表达式字符括号中包括连字符?

Python 3.5 async/await 与真实代码示例

javascript - 浏览器与 insertUnorderedList 的差异

javascript - n 秒后或单击按钮时自动关闭 div

javascript - 如何在页面完全加载之前将 jQuery 效果应用于元素?

asynchronous - F#中的异步工作流-并行执行,不等待结果