throttle(500)が最大で0.5秒ごとにしか実行されないDeferredオブジェクトを返す,みたいなのを作ってみた.
timerを持っておいてclearTimeoutするかわりに,Deferredを持っておいて,rejectすることができる.
処理内容を実行時に決められるので,普通のthrottleより汎用性が高いかもしれない.
呼び出された回数だけタイマーが実効されるので,普通に書くより効率は悪いと思う.
こういう風に使える.
# Deferredを返す
th = throttle(500)
# 0.5秒経つと呼ばれる
th('hello').then (msg) ->
console.log(msg)
# こっちは実行されない
th('good bye').then (msg) ->
console.log(msg)
コードはあまりかっこよくない.
debounceのほうがかっこいい.
throttle = (delay) ->
d = null
->
return $.Deferred().promise() if d
d = $.Deferred()
args = arguments
setTimeout ->
d.resolve args
d = null
, delay || 100
d.promise()
debounce = (delay) ->
lastd = $.Deferred()
->
lastd.reject()
d = $.Deferred()
lastd = d
args = arguments
setTimeout ->
d.resolve args
, delay || 100
d.promise()