Có cách nào để sử dụng cơ chế await() bên ngoài bộ điều khiển không?Các cuộc gọi WS không đồng bộ và chờ() bên ngoài bộ điều khiển
Tôi không muốn mã thực hiện cuộc gọi không đồng bộ trong bộ điều khiển, nhưng thay vào đó có mã trong lớp dịch vụ có thể được nhiều bộ điều khiển sử dụng lại, không có cách nào để gọi bên ngoài bộ điều khiển phương pháp được bảo vệ.
Vì vậy, ví dụ như trong bộ điều khiển:
ServiceClass service = new My ServiceClass();
MyObject myObject= service.getMeAnObject();
render(myObject);
Và các lớp dịch vụ:
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ó cách nào để đạt được một cái gì đó như thế?
Cảm ơn sự giúp đỡ của bạn.
Sửa: Tôi làm theo lời khuyên của Pere và làm cho lớp dịch vụ thực hiện điều khiển, nó hoạt động tuy nhiên, nó là cần thiết rằng bộ điều khiển sử dụng nó được nâng cao. Cách duy nhất tôi phát hiện ra để làm điều đó được thực hiện ít nhất là gọi một phương thức await() trong lớp điều khiển gọi.
Tuy nhiên, tôi vẫn chưa xác minh rằng mã thực sự bị tạm ngưng.
Chỉnh sửa 2: Một gợi ý tôi nhận được từ nhóm google là tôi thực sự nên cố gắng và làm như đang chờ đợi trong bộ điều khiển, như vậy có lẽ là một giải pháp tốt hơn sẽ được sử dụng dịch vụ phải trả lại một Hứa hẹn và yêu cầu bộ điều khiển chờ điều này nhưng sau đó không có cách nào để tôi làm điều đó?
Vì vậy, ví dụ như trong bộ điều khiển:
ServiceClass service = new My ServiceClass();
Promise<MyObject> promise = service.getMeAnObject();
MyObject myObject = await(promise);
render(myObject);
Và các lớp dịch vụ:
public class ServiceClass
{
...
public Promise<MyObject> getMeAnObject()
{
String url = "http://...";
// Somehow Build a Promise<MyObject>
}
...
}
}
Cảm ơn bạn đã trả lời. Nó dường như hoạt động. Tuy nhiên, nó không thực sự là giải pháp tốt nhất theo ý kiến của tôi, vì lớp dịch vụ không phải là một bộ điều khiển khái niệm. Lý tưởng nhất, cơ chế gián đoạn mã này sẽ có sẵn từ mọi nơi. –