从类型系统的角度来看,Observable和Single的是无关的。这基本上意味着当需要Observable时,不能使用Single的,反之亦然。然而,在两种情况下,两者之间的转换是有意义的:

  • 当我们使用Single作为Observable时,它会发出一个值和完成通知(或错误通知)

  • 当Single缺少某些Observable的操作符时,cache()就是一个这样的例子

让我们以第二个原因为例:

Single<String> single = Single.create(subscriber -> {
    System.out.println("Subscribing");
    subscriber.onSuccess("42");
});
Single<String> cachedSingle = single
    .toObservable()
    .cache()
    .toSingle();
cachedSingle.subscribe(System.out::println);
cachedSingle.subscribe(System.out::println);

我们在这里使用cache()操作符,因此Single只会在一第一次被订阅时候生成“42”一次。Single.toObservable() 是一种安全且易于理解的操作符。它将一个Single<T>实例,转换为Observable<T> ,然后立即发出一个元素,然后是一个完成通知(或者是一个错误通知)。相对应的toSingle()操作符则要需要更加专注(不要与single()操作符混淆;参见第92页的“Asserting Observable Has Exactly One Item Using single()“)。就像 single()一样,toSingle()将抛出一个异常,表示“Observable emitted too many elements”,如果潜在的Observable发出不止一个元素的话。类似地,如果可“Observable 是空的,则是“Observable emitted no items”:

Single<Integer> emptySingle =
    Observable.<Integer>empty().toSingle();
Single<Integer> doubleSingle =
    Observable.just(1, 2).toSingle();

现在您可能会认为,当toObservable()和toSingle()操作符相互使用时,后者是安全的,但不需要这样做。例如,中间Observable可能复制或丢弃Single发出的事件:

Single<Integer> ignored = Single
    .just(1)
    .toObservable()
    .ignoreElements() //PROBLEM
    .toSingle();

在前面的代码中,Observable 的ignoreElements()只会丢弃单个值发出的单个值。因此,当使用toSingle()操作符时,它所能看到的是一个没有任何元素发射就完成的Observable。有一件关于toSingle()操作符事要记住,就像我们目前发现的所有其他操作符一样,它是惰性的。只有当某个用户真正订阅时,才会出现一个关于该Observable没有准确发射一个事件的异常。

results matching ""

    No results matching ""