JSON-RPCでの非同期メソッド呼び出し方法
sugaさんとこで、Backlogのコンボの反応が遅いという指摘がありました。
このコンボの更新はJSON-RPCを使って、JavaScriptから直接サーバに問い合わせをおこなっています。確かに前から遅いと思っていましたが、どうやらJSON-RPCで、同期呼び出しを使っていたからでした。
■同期呼び出し
http://oss.metaparadigm.com/jsonrpc/manual.html#synchronous-calls
function updateComponents(id) { var jsonrpc = new JSONRpcClient("JSON-RPC"); // 同期呼び出しのため、サーバ側から処理が変えるまで待ちます。 var components = jsonrpc.xxxService.getComponents('1'); for (var i = 0; i < components.lengthl; i++) { var component = components[i]; ... }
JSON-RPCには非同期のメソッド呼び出しもあるみたいなので、
早速切り替えてみました。
同期、非同期の切り替えはコールバックメソッドを与えるかどうかの違いだけのようです。
■非同期呼び出し
http://oss.metaparadigm.com/jsonrpc/manual.html#asynchronous-calls
function updateComponents(id) { var jsonrpc = new JSONRpcClient("JSON-RPC"); // 第1引数にコールバックメソッドのメソッドを指定します。 // 非同期なので待ちはなく、呼び出しと同時に制御が戻ります。 jsonrpc.xxxService.getComponents(callbackGetComponents, id); } // このメソッドはgetComponentsが完了したあとで、呼び出されます。 // 第1引数は戻り値、第2引数はサーバサイドでの例外 function callbackGetComponents(components, exception) { if (exception != null) { alert(exception); } for (var i = 0; i < components.lengthl; i++) { var component = components[i]; ... } }
今日リリースするバージョンに非同期呼び出しの処理を入れてみました。
興味のある方は、
こちらでプロジェクトのコンボボックスを動かしてみてください。
コンポーネントやバージョンのコンボが非同期で更新されます。