Есть ли способ использовать механизм ожидания() вне контроллера?асинхронные вызовы WS и ждут() вне контроллера
Я не хочу, чтобы код выполнял асинхронный вызов в контроллере, но вместо этого имел этот код в классе службы, который может повторно использоваться несколькими контроллерами, однако невозможно вызвать вызов за пределами контроллера, поскольку метод защищен.
Так, например, в контроллере:
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);
}
...
}
Есть ли способ, чтобы добиться чего-то подобного?
Благодарим за помощь.
Редактировать: Я последовал совету Pere и сделал класс обслуживания реализовать контроллер, он работает, однако, необходимо, чтобы контроллер с помощью его можно повысить. Единственный способ, по которому я узнал, что это сделать, - это хотя бы вызвать метод wait() в классе вызывающего контроллера.
Однако, я все еще не проверял, что код фактически приостановлен.
Edit 2: Одно предложение, которое я получил от группы Google является то, что я должен действительно попытаться сделать AWAIT в контроллере, так что может быть, лучшим решением было бы для службы, чтобы вернуть Пообещайте и попросите контролера подождать, но тогда нет способа, чтобы я сделал это?
Так, например, в контроллере:
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>
}
...
}
}
Спасибо за ваш ответ. Кажется, он работает. Однако, на мой взгляд, это не лучшее решение, поскольку класс обслуживания не является концептуальным контроллером. В идеале этот механизм прерывания кода будет доступен из любого места. –