多くのRPCの状況において、通信を行う2つのエンドポイント間の同期は、RPCアプリケーションを適切に設計することで実現されます。同期が必要な場合は(ブロッキングとなる)リクエストを使用すべきであり、不要な場合は通知で十分です。しかし、Emacsがこれらのエンドポイントのいずれかとして動作する場合、リモートエンドポイントの状態が依然として不確定な間に、非同期イベント(例:タイマーやプロセス関連)がトリガーされることがあります。さらに、これらのイベントへの対応に同期が必要となるかどうかは、イベントの具体的な性質によって異なります。
jsonrpc-request および jsonrpc-async-request のキーワード引数 :deferred
は、特定のリクエストに同期が必要であり、何らかの条件が満たされるまで実際の発行が後日に延期される可能性があることを呼び出し側が指定できるように設計されています。リクエストに
:deferred を指定しても、それが必ず延期されるわけではなく、単に延期され得るということです。リクエストが直ちに送信されない場合、jsonrpc
は、エンドポイントへの他のメッセージの送受信時など、通信中の特定の重要なタイミングで再送を試みます。
リクエストを送信しようとする前に、アプリケーション固有の条件がチェックされます。jsonrpc
ライブラリはこれらの条件を把握できないため、プログラムでは jsonrpc-connection-ready-p 汎用関数(汎用関数 を参照)を使用してそれらを指定できます。この関数のデフォルトメソッドは
t を返しますが、渡された引数(jsonrpc-connection オブジェクト(概要 を参照)および :deferred キーワード引数として渡した値)に基づいて、特定の状況で nil を返すオーバーライドメソッドを追加することも可能です。