通信を書かない画面

業務システムの画面は、一つの gateway にサービス名を添えて要求を送り、決まった形式のエンベロープに包まれた応答を受け取ります。この画面では、その処理を共通部品に置き、画面のコードにはサービス名と送信内容だけを書きます。

Screen >> login =
  (rpc call: 'SA001LoginService' with: self credentials) forced
    ifPresent: [:j |
      Kept at: 'token' put: ((j at: 'access_token') asStr orElse: ['']).
      self with: { answer: ((j at: 'userName') asStr orElse: ['']) , ' さん、こんにちは' }]
    ifAbsent: [self].

Http、URL、トークン、サーバのエラー一覧は、この画面のコードには出てきません。出力された JavaScript にもそれらが含まれないことをテストで確認しています。

戻り値は Maybe

rpc call:with: は Maybe[Json] を返します。中身があるのはサーバが success を返したときだけです。それ以外の場合の処理は、共通部品の中で済んでいます。

サーバの応答共通部品の処理
success応答の中身を返す
errorエラーメッセージをエラー表示欄へ。中身無しで返す
fatal同上。さらにログイン画面へ遷移する
形式が違う応答その旨をエラー表示欄へ
HTTP ステータスが 2xx でないステータスを添えてエラー表示欄へ
ステータス 0(接続失敗)fatal と同じ

ifAbsent: に書くのは「状態を変えない」ことであって、エラー処理ではありません。

forced は画面に書く

通信を待つメソッドは Future を返すので、forced は画面のコードに書きます。これを共通部品の中に隠すと、待っている間に届いたメッセージの処理順序が画面から分からなくなります。

ページに用意する要素

オーバーレイとエラー表示欄は共通部品が mount するので、画面のコードには出てきません。ページには、それらを入れる要素を二つ用意します。エラー表示欄はページ上部に、オーバーレイの位置は CSS で決めます。

どちらも画面のアクタの領域の外に置きます。アクタは自分の領域を丸ごと描き直すので、領域の中に置いた要素は描き直しで消えます。