我们正在使用C#中的WatiN与浏览器(目前只有IE)进行交互。
WatiN的一些方法是一个简单的包装器,它向某些web元素发送“onchanged()”和“onclick()”。
WatiN还为此提供了即发即弃版本,它基本上提供了非阻止版本。
我的问题是,浏览器还有2个JS函数同时执行吗?
例如,假设以下代码:
// Uses FireEventAsync("onchanged")
SelectList.SelectNoWait()
SelectList.FireEventAsync("onclick")
可以同时执行onclick和onchanged两个JS函数吗?
我相信我们遇到了类似的问题,当我们触发另一个事件时,onchanged()函数仍在执行,我想知道这是否在技术上可行。
答案 0 :(得分:2)
不,只要您没有专门使用webworkers,就不能同时执行多次执行。浏览器上下文中只能有一个用户线程处于活动状态。
通常只执行对事件调用的小函数,大多数长任务与资源和异步相关。
当你认为“基于事件”和(最重要的)不尝试从自然异步(我想到AJAX)进行同步调用时,你没有问题。
答案 1 :(得分:1)
简而言之:不。 JavaScript执行是单线程的。
但是,对于异步操作(ajax,定时器,工作程序等),可以设置函数的某些部分,以便在线程空闲时执行。
一个人为的例子是:
function foo() {
setTimeout(function () {
console.log('three');
}, 10);
console.log('one');
}
function bar() {
console.log('two');
}
foo();
bar();
虽然同步调用foo
和bar
并且日志按three, one, two
的顺序写入,但它们将按one, two, three
的顺序执行,因为计时器将延迟以后记录“three'
。
而且,即使您的处理程序不使用任何异步操作,SelectNoWait
和FireEventAsync
也可能会这样做。