Весь смысл асинхронного обратного вызова состоит в том, чтобы уведомлять вас о том, что происходит асинхронно, когда-нибудь в будущем. Вы не можете вернуть s
из getConstraint
, если он будет установлен после , когда метод завершил работу.
При работе с асинхронными обратными вызовами вы должны переосмыслить поток вашей программы. Вместо getConstraint
, возвращающего значение, код, который переходит к , использует , это значение должно быть вызвано в результате обратного вызова.
В качестве простого (неполного) примера вам необходимо изменить это:
String s = getConstraint();
someGuiLabel.setText(s);
На что-то вроде этого:
myCallback = new AsyncCallback<String>() {
public void onSuccess(String result) {
someGuiLabel.setText(result);
}
}
fetchConstraintAsynchronously(myCallback);
Редактировать
Популярной альтернативой является концепция будущего . Будущее - это объект, который вы можете вернуть немедленно, но который будет иметь значение только в какой-то момент в будущем. Это контейнер, в котором вам нужно только дождаться значения в момент его запроса.
Вы можете думать о будущем, как о наличии билета на свой костюм в химчистке. Вы сразу получаете билет, можете хранить его в своем кошельке, отдавать другу ... но как только вам нужно обменять его на действительный, вам нужно подождать, пока костюм не будет готов.
В Java есть такой класс (Future<V>
), который широко используется ExecutorService API .