您好我试图使用Play Framework 2.4(Java)在具有异步结果http://mongodb.github.io/mongo-java-driver/3.0/driver-async/的控制器中编写MongoDB异步驱动程序(3.0)https://www.playframework.com/documentation/2.3.x/JavaAsync的异步代码,当我这样做时测试它Promise结果是在MongoDB的Async调用之外,所以有时我在响应中有空的json,请你能帮助我吗?
public F.Promise<Result> list() {
final List<Document> accounts = new ArrayList<Document>();
F.Promise<List<Document>> promiseOfAccounts = F.Promise.promise(
new F.Function0<List<Document>>() {
public List<Document> apply() {
accountRepository.getCollection().find().into(accounts,
new SingleResultCallback<List<Document>>() {
@Override
public void onResult(final List<Document> result, final Throwable t) {
}
});
return accounts;
}
}
);
return promiseOfAccounts.map(
new F.Function<List<Document>, Result>() {
public Result apply(List<Document> i) {
return ok(i);
}
}
);
}
答案 0 :(得分:0)
当你返回accounts
时,SigleResultCallback闭包还没有被执行。这导致列表在ok(i)
表达式中序列化时为空。为了使其有效,您必须自己在SingleResultCallback
内解决承诺。请记住,将游戏Promises
放在scala Future
和scala Promises(与Play F.Promise
s不同)上。这就是你要做的事情:
Promise<List<Document>> accountsPromise = Promise$.MODULE$.apply();
ArrayList<Document> accounts = new ArrayList<Document>();
accountRepository.getCollection().find().into(accounts,
new SingleResultCallback<List<Document>>() {
@Override
public void onResult(final List<Document> result, final Throwable t) {
accountsPromise.success(result);
}
});
promiseOfAccounts=F.Promise.wrap(accountsPromise.future());
return promiseOfAccounts.map(
new F.Function<List<Document>, Result>() {
public Result apply(List<Document> i) {
return ok(i);
}
}
);
当你调用scala success
的{{1}}方法结算时,所以未来的价值变得可用,但在此之前你会返回游戏Promise
,这真是太棒了反应式编程。