Java play framework 对同一对象的异步操作
Java play framework Async operation on same object
我正在尝试对同一个对象执行异步操作,例如我会将 List 传递给 Promise 以同时执行 3 个查询,其中每个查询在完成时将查询结果添加到列表,最后添加 http 结果 returns 所有并发查询结果完成时的完整列表。
看看这个教程:
https://www.playframework.com/documentation/2.2.x/JavaAsync
我可以做这样的东西
return async(
promise(new Function0<Integer>() {
public Integer apply() {
firstQuery();
}
})
. promise(new Function0<Integer>() {
public Integer apply() {
return secondQuery();
}
})
.map(new Function<Integer,Result>() {
public Result apply(Integer i) {
Logger.debug("we have got "+i);
return ok("Got " + i);
}
})
);
使 2 个操作同时工作,但我既不能将对象传递给 promise,也不能获得两个查询的结果来处理这两个结果。
您可以使用 Promise.sequence 来实现
F.Promise<Integer> one, two;
one = F.Promise.promise(new F.Function0<Integer>() {
@Override public Integer apply() throws Throwable {
return 20;
}
});
two = F.Promise.promise(new F.Function0<Integer>() {
@Override public Integer apply() throws Throwable {
return 22;
}
});
return F.Promise.sequence(one, two).map(new F.Function<List<Integer>, Result>() {
@Override
public Result apply(List<Integer> integers) throws Throwable {
int res = integers.get(0) + integers.get(1);
return ok("The answer is " + res);
}
});
我正在尝试对同一个对象执行异步操作,例如我会将 List 传递给 Promise 以同时执行 3 个查询,其中每个查询在完成时将查询结果添加到列表,最后添加 http 结果 returns 所有并发查询结果完成时的完整列表。
看看这个教程:
https://www.playframework.com/documentation/2.2.x/JavaAsync
我可以做这样的东西
return async(
promise(new Function0<Integer>() {
public Integer apply() {
firstQuery();
}
})
. promise(new Function0<Integer>() {
public Integer apply() {
return secondQuery();
}
})
.map(new Function<Integer,Result>() {
public Result apply(Integer i) {
Logger.debug("we have got "+i);
return ok("Got " + i);
}
})
);
使 2 个操作同时工作,但我既不能将对象传递给 promise,也不能获得两个查询的结果来处理这两个结果。
您可以使用 Promise.sequence 来实现
F.Promise<Integer> one, two;
one = F.Promise.promise(new F.Function0<Integer>() {
@Override public Integer apply() throws Throwable {
return 20;
}
});
two = F.Promise.promise(new F.Function0<Integer>() {
@Override public Integer apply() throws Throwable {
return 22;
}
});
return F.Promise.sequence(one, two).map(new F.Function<List<Integer>, Result>() {
@Override
public Result apply(List<Integer> integers) throws Throwable {
int res = integers.get(0) + integers.get(1);
return ok("The answer is " + res);
}
});