UIの実験・その1

また少しずつ実験したいと思っているので、メモを。

背景: GASを、Webサービスのバックグラウンドで動作させたい


Rajahで、Jasmine実行中の console.log() や、実行結果を(実行終了後ではなく)逐次表示させたいと思っています。

Rajahは現在、GASをWebサービスとして公開することでJasmine runnerの機能を実現していて、ボタンを押したクリックハンドラのコンテクストで Jasmine を実行しています。

なので、上記を実現するにはクリックハンドラと並行して、もうひとつ別のコンテクストを起動する必要があります。

また、GASのUIには、app.show()のようなUIをアップデートするメソッドがないので:

return app;

で、ハンドラを終了させることでUIを更新するしかありません。

つまり、Jasmine実行中のハンドラとは別に、たとえば100m秒間隔くらいでなんらかのハンドラを起動し、jasmine実行中のハンドラと共有されたキャッシュかなにかを経由してデータをうけとり、それをUIに表示する、というかたちで実現できればよさそうです。

そこで、自分自身を再起動するようにスケジューリングした上で、5分以内に(強制終了されずに)自ら終了するバックグラウンドハンドラが実現可能かどうか、少しずつ実験してみたいと思います。

やってみること


まずバックグラウンドタスクの候補として、Jasmine実行用のボタン(クリック)ハンドラとは別に、もうひとつハンドラを起動できなければお話にならないので:
  1. その2つめのハンドラは並行して動くか? イベントループのように、Jasmine実行中の最初のハンドラが終了しないと次が起動しないか?
  2. GASのコードから、別のハンドラを起動するためのイベントを発生させることができるか?
  3. ハンドラがUI(クライアントサイド)の状態を受け取り、サーバーハンドラの中で変更を加え、UI(クライアントサイド)に反映させるシーケンスの確認(仮説の検証)。
  4. 上記のシーケンスが複数並行で動作したときの挙動の確認(仮説の検証)。
  5. doGet()のなかから、最初のイベントを発行することはできるか?
  6. 実行時間の最大値の計測は、sleep中もカウントされてしまうか? sleep中はカウントされない?

とりあえず、このくらいを試してみたいと思ってます。

すべて都合よく動いてくれたら、Webサービスの裏側で動くバックグラウンドタスク用のsetTimer / setInterval みたいなサービスを用意して、イベントループを実現できたら便利かな、と・・・。


やってみたこと #1: 並行動作

とりあえず、UIでふたつのボタンを用意して、それぞれにハンドラを割り当て、同時並行で実行されるものかどうかを確認してみました。


結論 #1

動く。

クライアントサイドのUI(セッション)は共有されたまま、別のタスクとして起動されるようです。


2番以降は、またぼちぼちとやってみます。


補足

このGASの実行コンテクスト、なんだか重層的になっていて、これは複数タスクで共有される・されない、というのをきちんと整理しないとわけがわからなくなりそうな気がします。

先日のTOKYO-GASのとき、「それ、ときどき仕様が変わるんですよ。」と聞いたので、、、あとまわしにしていますが。






Comments