throttleは「UIイベントの過剰な発火を間引く」とか説明されるけど、Arduinoなどのデバイスを使う際に「アクチュエーターが動いてる間命令を受け付けないようにする」のにも使えるよ
という話。


参考

javascriptで発生するイベントを間引く – 終わる世界とコンテンツ
lodashとunderscoreにあるthrottle・debounceという関数について説明している。
関数をthrottoleやdebounceに渡すと、無駄な連続呼び出しを無視するようにしてくれる。
実装を見るとthrottleはdebounceのラッパーになっている。


5秒に1回

nodeで制御してるarduinoでサーボモーターを回してドアのカギ(サムターンキー)を開けてるんだけど、連続でカギ回せ命令が来たら無視したい。

今までDate.now()で最後の呼び出し時刻を保存したりしてた。

lodashのthrottleで1つ目の命令だけ通して、以降5秒間は命令を無視するにはこうする。5秒たったらまた命令を受け付ける。
door_open = (onComplete = ->) ->
arduino.servoWrite 9, 0 # 開けて
setTimeout ->
arduino.servoWrite 9, 180 # 閉める
onComplete()
, 2000

door_open_throttled = _.throttle door_open, 5000, trailing: false

on '開けろや', ->
door_open_throttled ->
console.log "開けました"

{trailing: false}というオプションをthrottleに渡さないと、スロットルが閉じた時に最後の命令も通してしまう。
つまりカギ開けろ命令がたくさん来たら2個通してしまう。
trailing: falseすると最初の1つだけ通る。


nodeでのarduino制御にはarduino-firmata npmを使ってる。