前回の記事でClient Actionにはコールバック関数を引数として渡せることがわかったので、今回は実際に役立ちそうな処理を作ってみました。
作ったもの
引数
- Function(Object型):実際に実行したい関数
- Arguments(Text型):その関数に渡す引数(JSON)
- Result(Long Integer型):関数実行結果(今回は例ではテーブルに登録したレコードのid)
メイン処理
- 2行目で引数を与え関数を実行。どうもOutSystemsはこれをすぐに実行するのではなくPromiseとして非同期実行するようで戻り値はPromiseになります
- 4行目で関数の実行結果をPromiseResultから取得しています。おそらくOutSystemsはPromiseを作るときに次のような処理をしていてPromiseResultの中身が複雑ですが、一応この処理でテーブルに登録したレコードのidは取得できました(OutSystemsの内部仕様が変わればすぐに動かなくなりそうなコードですが)
- 7行目でJavaScript APIを呼び出し、ブラウザのコンソールとGeneral Logに実行時間のログを出力しています
new Promise(function(resolve) {
var obj = {};
// 実際に実行したい関数の呼び出し
// objに色々追加
resolve(obj);
})
使い方
登録ボタン押下時に呼び出されるClient Actionの中で、登録処理を行うClient Action(もしくはServer Action)の代わりにCallWithLoggingを呼び出します。ここではCallWithLoggingの引数FunctionにProductCreateOrUpdate(Client Action)を設定しています。このようにすれば各ロジック(ProductCreateOrUpdateなど)はログのことを気にせず実装できますし、ログの保管先が変わったりした場合も修正するのはCallWithLoggingだけで済みます。
注意点
CallWithLoggingに汎用性を持たせるためArgumentsをJSONにしています。そのため本来ならばProductCreateOrUpdate(Client Action)の引数はProduct Entity型でいいのですが、CallWithLoggingを使うためにText型に変更する必要があります。ProductCreateOrUpdate(Server Action)も同様で、この中でJSONをProduct Entity型に変換しています。
CallWithLoggingは本当に使えるのか?
ここまで書いておいて何なのですが、正直CallWithLoggingはあまり使えない(役に立たない)と思います。既に書いた通りOutSystemsの内部仕様と密接になっていますしJSON変換も面倒です。ResultがLong Integer型なのも汎用性の観点で改良の余地があります。さらに実行時間測定するだけならLifeTimeで賄えると思います。ただ、別の用途で今回のパターンが役に立つことがあるかもしれません。思いついたらまた記事にしようと思います。