【问题标题】:Can IE execute two JavaScript functions concurrentlyIE可以同时执行两个JavaScript函数吗
【发布时间】:2012-07-02 16:54:13
【问题描述】:

我们正在使用 C# 中的 WatiN 与浏览器(目前只有 IE)进行交互。

WatiN 的一些方法是一个简单的包装器,可将onchanged()onclick() 发送到某些网络元素。

WatiN 还为此提供了一个即发即弃的版本,它基本上提供了一个非阻塞版本。

我的问题是,浏览器是否也有两个JS函数同时执行?

例如,假设以下代码:

// Uses FireEventAsync("onchanged")
SelectList.SelectNoWait()

SelectList.FireEventAsync("onclick")

JS函数onclick和onchanged可以同时执行吗?

我相信我们遇到了类似的问题,当我们触发另一个事件时,onchanged() 函数仍在执行,我想知道这在技术上是否可行。

【问题讨论】:

  • 这取决于我怀疑的浏览器。
  • Javascript 执行是事件驱动的,因此当您触发 onclickonchange 时,浏览器只需将处理程序添加到执行队列中。然后,它们按顺序执行。因此,如果您的问题是“是否可以同时触发事件” - 答案肯定是肯定的。但是,我认为它们被执行的顺序并不能保证。
  • 用浏览器类型 (IE) 更新了我的问题。
  • @J0HN 是否有任何关于执行模型的链接/文档,以了解这实际上是如何完成的?
  • @J0HN 基本上是正确的。我唯一想澄清的是,浏览器中的函数执行并不是实际上同时进行的,因此如果函数不是原子的,则不存在竞争条件的风险。如果您在另一个函数正在执行时触发一个事件,它应该在当前函数完成时排队等待处理。

标签: javascript c# .net dom-events watin


【解决方案1】:

不,只要不专门使用webworkers,就不能同时执行多个。浏览器上下文中只能有一个用户线程处于活动状态。

通常您只执行在事件上调用的小函数,大多数长任务与资源和异步相关。

如果您认为“基于事件”并且(最重要的是)不要尝试从自然异步的内容(我想到 AJAX)进行同步调用,那么您就没有问题。

【讨论】:

  • 真遗憾,因为我们正在经历的似乎是“竞争条件”,而且非常随机。我认为我的理论可以解释它。
【解决方案2】:

简而言之:没有。 JavaScript 执行是单线程的。

但是,使用异步操作(ajax、计时器、worker 等),可以设置函数的某些部分,以便稍后在线程空闲时执行。

一个人为的例子是:

function foo() {
    setTimeout(function () {
        console.log('three');
    }, 10);

    console.log('one');
}

function bar() {
    console.log('two');
}

foo();
bar();

虽然foobar是同步调用的,并且日志是按照three, one, two的顺序写入的,但是它们会按照one, two, three的顺序执行,因为定时器会延迟'three'的日志到后面.

而且,即使您的处理程序不使用任何异步操作,SelectNoWaitFireEventAsync 也可能会这样做。

【讨论】:

  • 谢谢。我将检查 FireEventAsync 的实现。这意味着可能会发生潜在的竞争条件,从而导致奇怪的行为。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-16
  • 1970-01-01
相关资源
最近更新 更多