check the words in batches, to avoid blocking the event loop

This commit is contained in:
Brian Gough 2015-03-02 16:58:10 +00:00
parent 86416775fc
commit 876ea130b9

View file

@ -44,9 +44,10 @@ class ASpellRunner
if new Date() - start > ASpell.ASPELL_TIMEOUT if new Date() - start > ASpell.ASPELL_TIMEOUT
@close(true) @close(true)
else if i < words.length else if i < words.length
word = words[i] # batch up the words to check for efficiency
@sendWord(word) batch = words.slice(i, i + ASpell.ASPELL_BATCH_SIZE)
i++ @sendWords(batch)
i += ASpell.ASPELL_BATCH_SIZE
setTimeout tick, 0 setTimeout tick, 0
else else
@close() @close()
@ -80,6 +81,13 @@ class ASpellRunner
sendWord: (word) -> sendWord: (word) ->
@sendCommand("^" + word) @sendCommand("^" + word)
sendWords: (words) ->
# Aspell accepts multiple words to check on the same line
# ^word1 word2 word3 ...
# See aspell.info, writing programs to use Aspell Through A Pipe
@sendCommand("^" + words.join(" "))
sendCommand: (command) -> sendCommand: (command) ->
@aspell.stdin.write(command + "\n") @aspell.stdin.write(command + "\n")
@ -96,5 +104,4 @@ module.exports = ASpell =
callback("process killed") callback("process killed")
setTimeout forceClose, @ASPELL_TIMEOUT setTimeout forceClose, @ASPELL_TIMEOUT
ASPELL_TIMEOUT : 4000 ASPELL_TIMEOUT : 4000
ASPELL_BATCH_SIZE : 100