1

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

WatiN 的一些方法是一个简单的包装器,它向某些 web 元素发送一个onchanged()和。onclick()

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

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

例如,假设以下代码:

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

SelectList.FireEventAsync("onclick")

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

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

4

2 回答 2

2

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

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

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

于 2012-07-02T17:27:12.697 回答
1

简而言之:没有。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'供以后使用。

而且,即使您的处理程序不使用任何异步的东西,SelectNoWait并且FireEventAsync很可能这样做。

于 2012-07-02T17:28:56.720 回答