Я предоставил обратный вызов сторонней библиотеке, которая в разное время вызывает предоставленный метод, предоставляя мне объект, который был изменен. Затем я выполняю асинхронный веб-запрос, чтобы получить дополнительные сведения и установить их на этом объекте, ниже приведен пример аналогичного примера;Как заблокировать существующие асинхронные веб-запросы?
public void update(Person person) {
if (person.getId() == -1) {
mService.getPersonDetails()
.flatMap(..)
.skip(..)
.subscribe(personResult -> person.setId(personResult.getId()))
}
}
Обновление называется довольно много раз и должно выполнять только запрос, если объект не имеет идентификатора. Проблема в том, что по крайней мере два запроса отправляются, поскольку первый запрос еще не завершен.
Как синхронизировать этот вызов метода, чтобы только один запрос отправлялся для каждого объекта, который прошел через обратный вызов? Я только хочу блокировать запросы для этого точного объекта, поэтому, если update() предоставляет разные объекты, было бы нормально отправлять новые запросы.
Установить флаг при запуске запроса (или перед его запуском) и очистить его при его сбое. Перед запуском нового запроса отметьте флажок (и убедитесь, что он всегда очищается при завершении работы/завершении). IdentityHashMap может использоваться для управления защитой флага для каждого экземпляра. – user2864740
Там могут быть более аккуратные способы справиться с этим, возможно, с помощью Futures (или другого управления асинхронным) вместо простых флагов, но на каком-то уровне это бит, который происходит - запоминание (и проверка) того, что представляет собой действие. Конечная цель, вероятно, не должна заключаться в том, чтобы «блокировать» вызов (звучит как пробка!), Но для того, чтобы принять или перенести (или сохранить некоторые комбинированные заявленные), в зависимости от желаемого поведения. – user2864740