在很多 RPC 场景中,两个通信端点之间的同步依赖于 RPC 应用的正确设计: 需要同步时应使用请求(阻塞式);无需同步时使用通知即可。 但是,当 Emacs 作为其中一个端点时,在远程端点状态尚不明确的期间, 可能会触发异步事件(例如定时器事件或进程相关事件)。 此外,根据事件的具体性质,处理这些事件有时才需要同步。
jsonrpc-request 和 jsonrpc-async-request 的关键字参数 :deferred,
用于让调用者表明该请求需要同步,其实际发送可以推迟到未来某个条件满足时。
为请求指定 :deferred 并不代表它 一定会 被延迟,只是 可以 被延迟。
如果请求没有立即发送,jsonrpc 会在通信的关键时机重新尝试发送,
例如在向端点收发其他消息时。
在每次尝试发送请求之前,都会检查应用特定的条件。
由于 jsonrpc 库无法知晓这些条件,程序可以通过
jsonrpc-connection-ready-p 泛化函数来指定(see 泛型函数)。
该函数的默认方法返回 t,但你可以根据传入的参数添加重载方法,
在某些情况下返回 nil。参数包括 jsonrpc-connection 对象(see 概述)
以及你通过 :deferred 关键字传入的值。