Previous: , Up: JSONRPCによる対話   [Contents][Index]


33.32.4 遅延されたJSONRPCリクエスト

多くのRPC状況下において、対話中の2つのエンドポイント間での同期は、RPCアプリケーションを正しくデザインするために問題となります。同期が必要な際にはリクエスト(ブロックする)、不必要なら通知で十分です。しかしこれらのエンドポイントのいずれかでEmacsが動作している際にはリモートエンドポイントの状態に不確実性が依然として残っているので、(タイマーやプロセスに関連する)非同期イベントがトリガーされる可能性があります。さらにこれらのイベントへの対応では、イベント固有の性質により、同期の要求が限定されるかもしれません。

jsonrpc-requestjsonrpc-async-requestにたいするキーワード引数:deferredは特定のリクエストに同期が必要なことを呼び出し側が示せるようにして、リクエストの実際の発行は何らかの条件が満足されるまで遅延できるようにデザインされています。あるリクエストへの:deferred指定はリクエストが遅延されるのではなく、遅延される可能性があることを意味します。リクエストが即座に送信されなければ、エンドポイントにたいして他のメッセージの受信や送信を行う際のように、通信中の特定タイミングでjsonrpcはリクエストを送る新たな試みを行います。

リクエストを送信するすべての試みの前にアプリケーション固有の条件がチェックされます。jsonrpcライブラリーがこれらの条件を知ることはできないので、それらを指定するためにプログラムはジェネリック関数jsonrpc-connection-ready-pを使用できます(ジェネリック関数を参照)。この関数のデフォルトメソッドはtをリターンしますが、これをオーバーライドして渡された引数( jsonrpc-connectionオブジェクト。概観を参照)とキーワード引数:deferredとして渡されたすべて値にもとづいてnilをリターンするメソッドを追加できます。