通信中のオーバーレイ

ボタンを押すと受注を読み込む画面です。サーバは意図的に遅れて応答するようにしてあり、その間オーバーレイが表示されます。

オーバーレイを画面のアクタに持たせられない理由

Screen >> load = (
  overlay tell show.
  r := (Http get: 'orders.json?delay=1200') forced.
  overlay tell hide.
  self with: { answer: self countIn: r } ).

ハンドラは次の状態を返し、状態が変わったときに描き直されます。forced で待っている間は、ハンドラがまだ状態を返していないので描き直されません。画面に loading : Bool のようなフィールドを持たせても、それが真になった状態が描かれるのは返事が戻った後です。実測でも、描き直しは待つ前と返った後の二回だけでした。

そのため、オーバーレイは別のアクタにして、ページの別の場所に mount します。画面のアクタが待っている間も、オーバーレイのアクタはメッセージを処理できます。一つのアクタが待つことと、ページ全体が止まることは別です。

forced で書く場合

オーバーレイを出す、待つ、消す、の三行が順に一つのハンドラに収まります。返事を自分宛のメッセージとして受け取る書き方と比べて、処理の順序がコードの順序と一致します。ボタン一回に通信一回の画面に向いています。

アクタである共通部品

日付を選ぶの部品はアクタではなく、状態を持ちません。オーバーレイは画面が待っている間に表示を変える必要があるので、表示中かどうかを状態として持つアクタです。

オーバーレイは呼び出し元にメッセージを返さないので、呼び出し元の画面の型に依存しません。どの画面からでも使えます。

ページに用意するのは、class 名二つ分の CSS と、画面のアクタの領域の外に置く要素です。