如何在Play中异步轮询函数?
我需要做什么:
到目前为止我得到了什么:
// Controller
public class Application extends Controller {
// Action
public static Promise<Result> startPoll(String id) {
Promise<Boolean> pollPromise = poller(id);
Promise<Result> resultPromise = pollPromise.map(pollResult -> ok(pollResult));
return resultPromise;
}
private static Promise<Boolean> poller(String id) {
// TODO How do you poll a function with promise of a boolean?
}
}
轮询不应阻止其他类似的请求完成。
答案 0 :(得分:1)
您可以使用以下递归函数解决此问题:
1)当轮询函数返回“就绪”时返回true
2)当轮询函数返回“未准备好”时,返回一个稍后检查的承诺
示例:
在Controller类中:
public Promise<boolean> processRequest() {
Task t = new Task;
t.startTask();
return taskPoller(t);
}
private Promise<Boolean> taskPoller(Task t) {
if (t.isDone()) {
return Promise.promise(()->true);
} else {
Promise<Boolean> p = Promise.timeout(true, 100); //100 milliseconds
return p.map((result) -> taskPoller(t));
}
}
答案 1 :(得分:0)
您将需要查看WebSockets或使客户端通过ajax轮询服务器。 See Here