SVX日記
2024-05-27(Mon) CoffeeScriptでcallback
前回の記事を「かきかけ」のまましばらく放置してしまっていたが、意図する機能の実装が「一応はできた」ものの、イマイチ美しくなく、記事に書くにはリファクタリングが必要な状況に陥ってしまったためであった。
やってみたかったのは、名札インスタンスとして、ドラッグ操作で位置変更されたことを送信し、名札インスタンスとして、位置変更指示を受信するという実装。通信セッションは共用だが、名札インスタンスとしてはそれを意識せず、自由に送信し、自分宛てのものだけを受信する。要するに名札インスタンスに処理を閉じたい。各名札は他の名札のことを意識せず、通信を送受信したい。コールバックを受けたい、ということだ。
class Mother
constructor: ->
@callbacks = []
set_callback: (ins) ->
@callbacks.push(ins) # 子インスタンスを配列に登録
meal_ready: (menu) ->
for ins in @callbacks
ins.meal_call(menu) # 子インスタンスの関数を呼ぶ
class Child
constructor: (mother, name) ->
@name = name
console.log('I am [%s].', @name)
mother.set_callback(@) # 親インスタンスに自分を登録
meal_call: (menu) -> # 親インスタンスから呼ばれる関数
console.log('I am [%s]. I like [%s]!', @name, menu)
#-----------------------------------------------
#
# Main
#
mom = new Mother
taro = new Child(mom, 'Taro')
jiro = new Child(mom, 'Jiro')
saburo = new Child(mom, 'Saburo')
mom.meal_ready('Pizza') # ゴハンだよー!!
結果は以下。
I am [Taro].
I am [Jiro].
I am [Saburo].
I am [Taro]. I like [Pizza]!
I am [Jiro]. I like [Pizza]!
I am [Saburo]. I like [Pizza]!
今回は「WebSocketの@onmessage」の延長で子インスタンスに受信内容を渡したり、「Imageの@onload」の延長で子インスタンスにイメージの読み込み完了を伝えたりするのに使ってみたが、なかなかイイ感じに書けた。