Develop with pleasure!

福岡でCloudとかBlockchainとか。

RemoteObjectのメソッド呼び出しでActionScriptの予約語に引っかかる。

FlexのRemoteObjectを使ってサーバサイドのServiceクラスのメソッドを呼び出すとき、↓のようなコードを書く。

var entity:Hoge = getHoge();
var remote:RemoteObject = new RemoteObject("HogeService");
remote.addEventListener(ResultEvent.RESULT, resultHandler);
remote.addEventListener(FaultEvent.FAULT, faultHandler);
remote.showBusyCursor = true;
remote.delete(entity); 


この例だと、HogeServiceのdeleteメソッドを呼び出すようになる。ただ、残念ながらdeleteがActionScript予約語なので↑のコードはコンパイルエラーになる。
自動生成されるDAOなんかでdeleteメソッドとか普通にある状況は多いと思うので呼べないのはツライ。

こういったケースの場合は、mx.rpc.AbstractOperationを使うことで解決できる。remote.delete(entity); してる箇所を↓のように書き換える。

var op:AbstractOperation = remote.getOperation("delete");
op.send(entity);


もしくは、

var op:AbstractOperation = remote.getOperation("delete");
var args:Array = new Array();
args[0] = entity;
op.arguments = args;
op.send();


getOperation("delete")した際に、nameプロパティがdeleteがセットされたOperationオブジェクトが生成される。

ただ、よくよく考えると一番最初のRemoteObjectへのサービス呼び出しのコードって、RemoteObjectに対して呼び出し先のServiceのメソッドをコールしているが、ActionScript上どうやって処理されているのか気になる。

これは、RemoteObject < AbstractService < Proxyという継承関係があって、flash.utils.Proxyを継承しているのが肝。
remote.delete(entity); といった処理はAbstractServiceのcallPropertyメソッドに処理が委譲される。callPropertyの内部は↓なコード。

override flash_proxy function callProperty(name:*, ... args:Array):*
{
    return getOperation(getLocalName(name)).send.apply(null, args);
}


呼び出したプロパティ名のOperationオブジェクトを生成してsendメソッドを実行してる。