¿Hay alguna manera de usar el mecanismo await() fuera de un controlador?llamadas WS asíncronas y espera() fuera de un controlador
No deseo que el código realice la llamada asíncrona en el controlador, sino que tenga ese código en una clase de servicio que pueda ser reutilizado por múltiples controladores, sin embargo, no hay forma de esperar a la llamada fuera del controlador ya que método está protegido.
Así por ejemplo, en el controlador:
ServiceClass service = new My ServiceClass();
MyObject myObject= service.getMeAnObject();
render(myObject);
Y la clase de servicio:
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);
}
...
}
¿Hay una manera de lograr algo por el estilo?
Gracias por su ayuda.
Edición: Me siguió el consejo de Pere e hizo la clase de servicio implementar controlador, funciona sin embargo, es necesario que el controlador de usarla ser mejorada. La única forma en que descubrí que lo hice es invocar al menos el método await() en la clase del controlador llamante.
Sin embargo, todavía no he verificado que el código esté realmente suspendido.
Edición 2: Una sugerencia que tengo del grupo que Google es que realmente debería tratar de hacer la esperan en el controlador, por lo que tal vez una solución mejor sería que el servicio a devolver un Prométeme y haz que el controlador espere esto pero luego no hay forma de que yo todo esté ahí?
Así por ejemplo, en el controlador:
ServiceClass service = new My ServiceClass();
Promise<MyObject> promise = service.getMeAnObject();
MyObject myObject = await(promise);
render(myObject);
Y la clase de servicio:
public class ServiceClass
{
...
public Promise<MyObject> getMeAnObject()
{
String url = "http://...";
// Somehow Build a Promise<MyObject>
}
...
}
}
Gracias por su respuesta. Parece que funciona Sin embargo, no es realmente la mejor solución en mi opinión, ya que la clase de servicio no es conceptualmente un controlador. Idealmente, este mecanismo de interrupción del código estaría disponible desde cualquier lugar. –