33.32.4 Отложенные запросы JSONRPC

Во многих ситуациях RPC синхронизация между двумя коммуницирующими конечными точками является вопросом правильного проектирования приложения RPC: когда требуется синхронизация, следует использовать запросы (которые блокирующие); когда это не требуется, достаточно уведомлений. Однако, когда Emacs выступает в качестве одной из этих конечных точек, асинхронные события (например, связанные с таймером или процессом) могут срабатывать, пока существует неопределенность относительно состояния удаленной конечной точки. Более того, реагирование на эти события может иногда требовать синхронизации, в зависимости от специфики самого события.

Ключевой аргумент :deferred для jsonrpc-request и jsonrpc-async-request предназначен для того, чтобы позволить вызывающей стороне указать, что конкретный запрос требует синхронизации, и его фактическая отправка может быть отложена до будущего, пока не будет выполнено некоторое условие. Указание :deferred для запроса не означает, что он будет отложен, а только что он может быть отложен. Если запрос не отправляется немедленно, jsonrpc предпримет новые попытки отправить его в определенные ключевые моменты во время связи, например, при получении или отправке других сообщений конечной точке.

Перед любой попыткой отправки запроса проверяются условия, специфичные для приложения. Поскольку библиотека jsonrpc не может знать, каковы эти условия, программа может использовать обобщенную функцию jsonrpc-connection-ready-p (см. Обобщенные функции), чтобы указать их. Метод по умолчанию для этой функции возвращает t, но вы можете добавить переопределяющие методы, которые возвращают nil в некоторых ситуациях, основываясь на аргументах, переданных ей, которые являются объектом jsonrpc-connection (см. Обзор) и любое значение, которое вы передали в качестве ключевого аргумента :deferred.