2011-06-23 52 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 - 但我沒有任何經驗。