1
1

More than 1 year has passed since last update.

[OutSystems]コールバック関数を渡すと自動的にログを取ってくれるClient Action作ってみた

Last updated at Posted at 2022-02-23

前回の記事でClient Actionにはコールバック関数を引数として渡せることがわかったので、今回は実際に役立ちそうな処理を作ってみました。

作ったもの

引数

image.png

  • Function(Object型):実際に実行したい関数
  • Arguments(Text型):その関数に渡す引数(JSON)
  • Result(Long Integer型):関数実行結果(今回は例ではテーブルに登録したレコードのid)

メイン処理

image.png

  • 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);
})

使い方

image.png

登録ボタン押下時に呼び出される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型に変換しています。

image.png

CallWithLoggingは本当に使えるのか?

ここまで書いておいて何なのですが、正直CallWithLoggingはあまり使えない(役に立たない)と思います。既に書いた通りOutSystemsの内部仕様と密接になっていますしJSON変換も面倒です。ResultがLong Integer型なのも汎用性の観点で改良の余地があります。さらに実行時間測定するだけならLifeTimeで賄えると思います。ただ、別の用途で今回のパターンが役に立つことがあるかもしれません。思いついたらまた記事にしようと思います。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1