有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何处理一个可观察对象发出的项,并访问另一个对象的值?

我需要执行一个异步call_1,捕获它的可观察reply_1,然后再进行另一个异步call_2,当处理它的reply_2时,我还需要访问reply_1

我试过这样的方法:

public rx.Observable<Game> findGame(long templateId, GameModelType game_model, GameStateType state) {

rx.Observable<RxMessage<byte[]>> ebs = context.getGameTemplate(templateId);

return context.findGame(templateId, state) // findGame returns rx.Observable<RxMessage<byte[]>>

    .flatMap(new Func1<RxMessage<byte[]>, rx.Observable<Game>>() {

        @Override
        public Observable<Game> call(RxMessage<byte[]> gameRawReply) {

            Game game = null;

            switch(game_model) {

                case SINGLE: {

                    ebs.subscribe(new Action1<RxMessage<byte[]>>() {

                        @Override
                        public void call(RxMessage<byte[]> t1) {

                            game = singleGames.get(0);

                        }
                    });
                }
            }

            return rx.Observable.from(game);
        }
    });
}

由于gamefinal问题,我在编译这个方法时仍然有问题

这是解决这个问题的正确方法,还是有一种非常自然的方法来完成我想做的事情


共 (1) 个答案

  1. # 1 楼答案

    如果我正确理解您想要做什么,我认为解决这个问题的自然方法是zip

    您有两个异步发出结果的可观察对象,即ebscontext.findGame(...)的返回值

    您可以通过执行以下操作来组合它们的结果:

    public rx.Observable<Game> findGame(long templateId, GameModelType game_model, GameStateType state) {
    
        rx.Observable<RxMessage<byte[]>> ebs = context.getGameTemplate(templateId);
        rx.Observable<RxMessage<byte[]>> gameObs = context.findGame(templateId, state);
    
        return Observable.zip(gameObs, ebs, new Func2<RxMessage<byte[]>, RxMessage<byte[]>, Game>() {
    
            @Override
            public Game call(RxMessage<byte[]> gameRawReply, RxMessage<byte[]> t1) {
    
                Game game = null;
    
                switch(game_model) {
                    case SINGLE: {
                        game = singleGames.get(0);
                    }
                }
    
                return game;
            }
        });
    }
    

    Func2——zip的第三个参数——将在源观测值的都调用了它们的^{时被调用。它将用于将它们发出的值组合为Game类型的新值,并将这些值发送给生成的可观察对象的订户

    编辑:更多信息

    注意,我将call()的返回从Observable<Game>更改为仅返回游戏。否则,zip的结果将不是一个Observable<Game>,而是一个Observable<Observable<Game>>。与map和flatMap不同,rx中只有zip-没有flatZip。但是,由于您总是希望为每对输入项(一个来自ebs,一个来自gameObs)只发射一个游戏,因此在本例中这不是问题

    此外,Func2的调用()现在可以进一步简化为:

    @Override
    public Game call(RxMessage<byte[]> gameRawReply, RxMessage<byte[]> t1) {
    
        switch(game_model) {
            case SINGLE: {
                return singleGames.get(0);
            }
        }
    }