【问题标题】:JavaScript equivalent of SwingUtilities.invokeLater()等效于 SwingUtilities.invokeLater() 的 JavaScript
【发布时间】:2012-01-20 19:47:13
【问题描述】:

在 Javascript 中是否有与 Java 的 invokeLater() 方法和 SwingUtilities 等效的方法?

更新 1

那么,零延迟的setTimeout() 会和invokeLater() 完全一样吗?

【问题讨论】:

  • 我认为您错过了@Tomasz 回答的重点:setTimeout() 永远不会与invokeLater() 做同样的事情,因为它会在调用延迟函数时阻塞您的 UI 线程 .
  • 我认为问题是它是否总是会立即返回并直接从 UI 循环中执行其函数参数,即使参数为零,或者有时会立即执行函数。
  • @FrédéricHamidi Swing 的 invokeLater 也是如此。这也总是在 UI 线程上运行它的参数,但它保证总是立即返回并直接从事件循环中执行。

标签: java javascript equivalent invokelater


【解决方案1】:
  1. 如果你想异步运行某些东西(稍后),试试setTimeout()

  2. JavaScript 是单线程的。如果您想在事件处理程序之外运行一些耗时(CPU 密集型)任务,您可以使用上述技术执行此操作,但它仍会消耗事件处理线程(导致您的 UI 冻结)。

在浏览器中运行 CPU 密集型任务通常是个坏主意(web workers 可能会改变这一点),因为它们与事件处理程序共享同一个线程,让它们等待。

另见

【讨论】:

  • 零延迟的setTimeout() 会和invokeLater() 完全一样吗?
  • @Dims,是的,这应该是我回答的一部分。
【解决方案2】:

试过setTimeout,它让用户界面给人一种可以工作的印象,但不知何故花了很长时间。像这样的:

for (...) {
    setTimeout(function() {
        // show a loading icon
        // AJAX call
        // heavy DOM manipulation
    });
}

试过Promise。结果只是更好更快。所以现在的代码是这样的:

for (...) {
    var promise = new Promise(function() {
        // show a loading icon
        // AJAX call
        // heavy DOM manipulation
    });
}

【讨论】:

    猜你喜欢
    • 2016-05-10
    • 2012-08-19
    • 2023-03-21
    • 2010-11-29
    • 2010-12-29
    • 2010-10-21
    • 2011-07-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多