【发布时间】:2014-12-20 13:08:18
【问题描述】:
我在理解如何在具有不同返回类型的流\Observables 之间进行组合时遇到概念性问题。
这是我正在尝试编码的草稿方法:
public void findSeat() {
rx.Observable<GameObject> userObs = context.getUser();
rx.Observable<ActiveGame> gameObs = context.findGame();
rx.Observable.zip(userObs, gameObs, (userObj, game) -> {
User user = ...;
final List<Object> results = new ArrayList<Object>(3);
if(userObj.getStatus() != ErrorCodes.STATUS_OK) {
results.add(-1);
return results;
}
...
...
//***********************************
// THE PROBLEM IS HERE:
// "context.getActiveGameManager().updateGame(game)" returns Observable<GameOBject> and not List<Object> like .zip() expects.
// because of that I cannot do:
// "return context.getActiveGameManager().updateGame(game);"
// How can I do this convertion from Observable<GameObject> to List<Object>
//************************************
context.getActiveGameManager().updateGame(game)
.map((gameObj) -> {
if(gameObj.getStatus() != ErrorCodes.STATUS_OK) {
results.add(-2);
return (Observable<? extends Object>) results;
}
results.add(ErrorCodes.STATUS_OK);
results.add(user);
results.add(gameObj);
return gameObs;
});
return Observable.empty();
}).subscribe((results) -> {
int status = (int) results.get(0);
User user = (User) results.get(1);
ActiveGame game = (ActiveGame) results.get(2);
replyObj.reply(new JsonObject()
.putString("action", CommandActions.FIND_SEAT)
.putNumber("status", status);
.putNumber("game_id", game.getGameId())
);
});
}
流程如下: 1. 使用 .zip 方法发出 2 个 Observable。 2. 对流的返回值做一些逻辑,如果它导致错误代码 --> 将其放入列表中并返回,以便“订阅”可以将错误返回给用户。 3. 如果没有错误,使用 flatMap() 发出另一个“更新”方法——这就是我的问题所在。 4. 最终,所有的结果都应该在“订阅”中处理,因为这是我承认用户关于他的请求的一点。
希望它足够清楚......
顺便说一句,我正在尝试学习 rxJava,但我很难找到足够好的资源 - 有人可以向我推荐最好的学习方法吗?我尝试在 Youtube、Wikipedia、Github 上查看教程......其中大多数使用 Scala 和其他脚本语言进行教学 - 在 Java 中找不到任何内容。
感谢所有努力理解它的人!
【问题讨论】:
标签: java system.reactive reactive-programming rx-java