33.32.4 延迟 JSONRPC 请求

在很多 RPC 场景中,两个通信端点之间的同步依赖于 RPC 应用的正确设计: 需要同步时应使用请求(阻塞式);无需同步时使用通知即可。 但是,当 Emacs 作为其中一个端点时,在远程端点状态尚不明确的期间, 可能会触发异步事件(例如定时器事件或进程相关事件)。 此外,根据事件的具体性质,处理这些事件有时才需要同步。

jsonrpc-requestjsonrpc-async-request 的关键字参数 :deferred, 用于让调用者表明该请求需要同步,其实际发送可以推迟到未来某个条件满足时。 为请求指定 :deferred 并不代表它 一定会 被延迟,只是 可以 被延迟。 如果请求没有立即发送,jsonrpc 会在通信的关键时机重新尝试发送, 例如在向端点收发其他消息时。

在每次尝试发送请求之前,都会检查应用特定的条件。 由于 jsonrpc 库无法知晓这些条件,程序可以通过 jsonrpc-connection-ready-p 泛化函数来指定(see 泛型函数)。 该函数的默认方法返回 t,但你可以根据传入的参数添加重载方法, 在某些情况下返回 nil。参数包括 jsonrpc-connection 对象(see 概述) 以及你通过 :deferred 关键字传入的值。