Single.fromObservable()的行为

时间:2018-03-16 21:20:05

标签: rx-java observable rx-java2

Single.fromObservable()的文档说“如果来源Observable有多个元素,则会发出IndexOutOfBoundsException信号。”但是,如果在收到(并重新发射)Observable的第一个元素后立即处理订阅,则永远不会发生这种情况。 Single必须维持订阅,直到收到onNext() [导致IndexOutOfBoundsException],onComplete() [可能导致其取消订阅Observable] ,或onError [推测通过下游]。

此运算符如何以及何时处理来自源Observable的取消订阅?文件是否正确?

1 个答案:

答案 0 :(得分:1)

是的,文档是正确的。如果您有疑问,请查看source code

public void onNext(T t) {
    if (done) {
        return;
    }
    if (value != null) {
        done = true;
        s.dispose();
        actual.onError(new IllegalArgumentException("Sequence contains more than one element!"));
        return;
    }
    value = t;
}
  

但是,如果在收到(并重新发射)Observable的第一个元素后立即处理订阅,这种情况永远不会发生。

操作员不会在第一次发射后处理,而是仅在第二项之后处置,产生IndexOutOfBoundsException

之后,onComplete is responsible用于发出单个项目(或默认项目):

@Override
public void onComplete() {
    if (done) {
        return;
    }
    done = true;
    T v = value;
    value = null;
    if (v == null) {
        v = defaultValue;
    }

    if (v != null) {
        actual.onSuccess(v);
    } else {
        actual.onError(new NoSuchElementException());
    }
}