Подождите, пока функция асинхронного обратного вызова вернется в Java - PullRequest
0 голосов
/ 12 марта 2019
final Function<Boolean, ? extends Class<Void>> functionCallback = (Boolean t) -> {
   if(t) {
     plugin.setIsInstalled(Boolean.TRUE);             
   }
   return Void.TYPE;
};

foo.install(plugin,functionCallback);

if(plugin.getIsInstalled().getValue())
  return "done";
else 
  return "not done";

Я хочу проверить if(plugin.getIsInstalled().getValue()) после завершения обратного вызова. Как я могу предотвратить выполнение этого условия, если обратный вызов не завершил выполнение?

Ответы [ 3 ]

1 голос
/ 12 марта 2019

Вы можете использовать FutureTask, который вызывается в вашей функции обратного вызова:

final FutureTask<Object> ft = new FutureTask<Object>(() -> {}, new Object());
final Function<Boolean, ? extends Class<Void>> functionCallback = (Boolean t) -> {
    if(t) {
        plugin.setIsInstalled(Boolean.TRUE);
        ft.run();
    }
    return Void.TYPE;
};

foo.install(plugin,functionCallback); 
ft.get();
if(plugin.getIsInstalled().getValue())
    return "done";
else 
    return "not done";

Future.get ожидает вызова метода run, вы также можете использовать get -методкоторый принимает тайм-аут, так что вы можете отреагировать на это, если это займет слишком много времени.

0 голосов
/ 12 марта 2019
  1. Вы можете использовать CountDownLatch или ReentrantLock, которые освобождаются при запуске функции.
  2. Ваш foo#install может вернуть CompletableFuture, и вы можете использовать результаты следующим образом
CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> 1);
future.thenAccept((v) -> System.out.println("v = " + v));
  1. Сама функция имеет метод andThen, который вы можете использовать для запуска того, что требуется после apply.
0 голосов
/ 12 марта 2019

Обратный вызов в основном используется для выполнения задачи после выполнения определенной задачи. Так что лучше разделить код, который вы хотите выполнить, в другую функцию, вызывающую эту функцию.

Если вы хотите выполнить что-то после обратного вызова, используйте вложенные обратные вызовы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...