2011-06-23 38 views

回答

0

我不太清楚你所说的“执行”的意思,但在某些情况下,它可能变成一个阻塞操作进入一个循环:

s = "long thing" 
re = /[a-z]/g 

// blocks 
matches = s.match(re) 

// doesn't block 
matches = [] 
while(m = re.exec(s)) { 
matches.push(m[0]) 
do your time check here 
} 
+0

如何是第二个例子无阻塞?我以为're.exec(s)'会在一次调用中评估整个's'字符串,这意味着''while'循环只会执行一次。但我可能是错的。 –

+0

事实上,废话 - 我现在明白你的意思。然而,如果两次匹配之间的时间少于5秒,这肯定会起作用 - 即只有当匹配发生时,while循环内的代码才会执行​​,并且如果在匹配之间超过5秒钟,代码会阻塞直到下一个匹配被发现。是对的吗? –

+0

谢谢,这是一个公平的观点 - 显然对Web Workers的浏览器支持有限,而您的解决方案使用Javascript的本地语言功能。 –

2

我现在想的唯一方法就是在单独的线程中使用WebWorkers API运行正则表达式,并在主线程中使用计时器来表示'超时'并使用myTimer.terminate();语法来终止工作线程。然而,这会给表格带来一大堆问题,因为工作线程没有任何访问DOM的行为,并且完全像一个简单的消息总线。

1

在JavaScript中评估正则表达式是一种阻塞操作,因此您没有时间和取消其执行的机会。一个可能的解决方案将使用web workers - 但我没有任何经验。