多くのRPC状況下において、対話中の2つのエンドポイント間での同期は、RPCアプリケーションを正しくデザインするために問題となります。同期が必要な際にはリクエスト(ブロックする)、不必要なら通知で十分です。しかしこれらのエンドポイントのいずれかでEmacsが動作している際にはリモートエンドポイントの状態に不確実性が依然として残っているので、(タイマーやプロセスに関連する)非同期イベントがトリガーされる可能性があります。さらにこれらのイベントへの対応では、イベント固有の性質により、同期の要求が限定されるかもしれません。
jsonrpc-request
やjsonrpc-async-request
にたいするキーワード引数:deferred
は特定のリクエストに同期が必要なことを呼び出し側が示せるようにして、リクエストの実際の発行は何らかの条件が満足されるまで遅延できるようにデザインされています。あるリクエストへの:deferred
指定はリクエストが遅延されるのではなく、遅延される可能性があることを意味します。リクエストが即座に送信されなければ、エンドポイントにたいして他のメッセージの受信や送信を行う際のように、通信中の特定タイミングでjsonrpc
はリクエストを送る新たな試みを行います。
リクエストを送信するすべての試みの前にアプリケーション固有の条件がチェックされます。jsonrpc
ライブラリーがこれらの条件を知ることはできないので、それらを指定するためにプログラムはジェネリック関数jsonrpc-connection-ready-p
を使用できます(ジェネリック関数を参照)。この関数のデフォルトメソッドはt
をリターンしますが、これをオーバーライドして渡された引数(
jsonrpc-connection
オブジェクト。概観を参照)とキーワード引数:deferred
として渡されたすべて値にもとづいてnil
をリターンするメソッドを追加できます。