代码之家  ›  专栏  ›  技术社区  ›  Martin

可观察到。具有状态的生成器,其中异步更新新状态

  •  1
  • Martin  · 技术社区  · 6 年前

    这是一个有点做作的例子,但请容忍我。假设我有一种方法,例如:

    Single<String> getValue(int offset);
    

    我想多次调用它,每次传递不同的偏移量,但偏移量是基于之前返回的字符数。

    所以也许 getValue(0) 返回“Cat”。因为它返回了3个字符,所以我想调用 getValue(3) ,可能返回“Horse”。然后计算返回的字符数,我的下一个调用是 getValue(8)

    Observable.generate(initialState, generator) 状态是偏移量的地方似乎没有给出我想要的,因为它要求生成器返回下一个状态,我不一定知道。

    我将如何创建一个可观察对象来生成如上所述的值?

    1 回复  |  直到 6 年前
        1
  •  0
  •   Martin    6 年前

    我很想看看是否有不那么冗长的解决方案,但以下是我目前正在使用的解决方案:

    我定义了一个“State”类,它保存偏移量,并委托给真正的实现。这充分利用了以下事实: generate 是同步的。

    private static class State {
        private final int offset = 0;
        private final AnimalFetcher delegate;
        State(AnimalFetcher delegate) { this.delegate = delegate; }
    
        void getNextValue(Emitter<String> emitter) {
            delegate.getValue(offset)
                .doOnSuccess(animal -> offset += animal.size())
                .subscribe(emitter::onNext, emitter::onError);
        }
    }
    
    Observable<String> getAllTheAnimals() {
        return Observable.generate(
            () -> new State(this),
            State::getNextValue
        );
    }