Esiste un modo per utilizzare il meccanismo await() all'esterno di un controller?chiamate WS asincrone e waitit() all'esterno di un controller
Non desidero che il codice esegua la chiamata asincrona nel controller, ma invece il codice in una classe di servizio che può essere riutilizzato da più controller tuttavia, non c'è modo di richiamare l'attesa all'esterno di un controller dal quel il metodo è protetto.
Così, per esempio nel controller:
ServiceClass service = new My ServiceClass();
MyObject myObject= service.getMeAnObject();
render(myObject);
E la classe di servizio:
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);
}
...
}
C'è un modo per ottenere qualcosa di simile?
Grazie per il vostro aiuto.
Edit: Ho seguito il consiglio di Pere e ha fatto la classe di servizio implementare controller, funziona però, è necessario che il controller di usarlo essere migliorata. L'unico modo che ho scoperto per ottenere quello fatto è almeno invocare una volta che il metodo await() nella classe controller di chiamata.
Tuttavia, non ho ancora verificato che il codice sia effettivamente sospeso.
Edit 2: Un suggerimento che ho ricevuto dal gruppo Google è che dovrei veramente provare a fare l'attendono nel controller, quindi forse una soluzione migliore sarebbe quella per il servizio per restituire un Prometti e aspetta che il controller attenda questo ma poi non c'è modo per me che todo ci sia?
Così, per esempio nel controller:
ServiceClass service = new My ServiceClass();
Promise<MyObject> promise = service.getMeAnObject();
MyObject myObject = await(promise);
render(myObject);
E la classe di servizio:
public class ServiceClass
{
...
public Promise<MyObject> getMeAnObject()
{
String url = "http://...";
// Somehow Build a Promise<MyObject>
}
...
}
}
Grazie per la risposta. Sembra funzionare. Tuttavia, a mio avviso non è la soluzione migliore, in quanto la classe di servizio non è concettualmente un controller. Idealmente, questo meccanismo di interruzione del codice sarebbe disponibile da qualsiasi luogo. –