通信を書かない画面
業務システムの画面は、一つの 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 で決めます。
どちらも画面のアクタの領域の外に置きます。アクタは自分の領域を丸ごと描き直すので、領域の中に置いた要素は描き直しで消えます。