Есть ли способ использовать th е механизм await () вне контроллера?
Я не хочу, чтобы код выполнял асинхронный вызов в контроллере, но вместо этого имел бы этот код в классе обслуживания, который может быть повторно использован несколькими контроллерами, однако, нет никакого способа для вызова await вне контроллера, поскольку этот метод защищен.
Так, например, в контроллере:
ServiceClass service = new My ServiceClass();
MyObject myObject= service.getMeAnObject();
render(myObject);
И класс обслуживания:
public class ServiceClass
{
...
public MyObject getMeAnObject()
{
String url = "http://...";
Promise<HttpResponse> promise = url(url).getAsync();
// do something here similar to await in a controller
// that suspends the code waiting for the response
// to be retrieved
HttpResponse response = promise.get();
return buildMyObjectFromResponse(reponse);
}
...
}
Есть ли способ добиться чего-то подобного?
Спасибо за вашу помощь.
Правка : Я последовал совету Пера и заставил класс обслуживания реализовать Controller, однако он работает, необходимо, чтобы контроллер, использующий его, был улучшен. Я обнаружил, что единственный способ сделать это - по крайней мере один раз вызвать метод await () в вызывающем классе контроллера.
Однако я до сих пор не проверил, приостановлен ли код.
Редактировать 2: Одно из предложений, которое я получил от группы Google, состоит в том, что мне действительно нужно попытаться выполнить ожидание в контроллере, поэтому, возможно, лучшим решением будет для службы вернуть Обещай, и пусть контроллер дождется этого, но потом у меня нет возможности сделать то, что есть?
Так, например, в контроллере:
ServiceClass service = new My ServiceClass();
Promise<MyObject> promise = service.getMeAnObject();
MyObject myObject = await(promise);
render(myObject);
И класс обслуживания:
public class ServiceClass
{
...
public Promise<MyObject> getMeAnObject()
{
String url = "http://...";
// Somehow Build a Promise<MyObject>
}
...
}
}