让我们来看两个用 Rx 编写的方法:
Maybe<Foo> getFooFromLocal
Single<Foo> getFooFromNetwork
我想在检查本地存储的Foo 时编写一个链。如果我们没有任何 Foo,我们应该从网络中获取它,然后将其保存到本地存储,然后再次从本地存储中获取并将其传递给我们的订阅者。
storage
.getFooFromLocal()
.switchIfEmpty(network.getFooFromNetwork().map { it[0] }
.flatMapCompletable { storage.saveFoo(it) }
.andThen(storage.getFooFromLocal()))
.subscriber(/**/)
问题是 andThen
部分在 completable 传递到 flatMapCompletable
之前完成。我发现如果我包装到 Maybe.defer{}
中,我可以摆脱这个问题。但是根据 andThen
的文档
它
Returns a
Maybe
which will subscribe to this Completable.
也许已经是
Represents a deferred computation and emission of a maybe value or exception
所以问题是为什么我的 andThen
部分在 completable 完成之前运行。编写此类链条的最佳和优雅方式是什么。
通话记录:
06:05:58.803 getFooFromLocal
06:05:58.804 getFooFromLocal
06:05:58.804 getFooFromNetwork
06:05:59.963 saveFoo
最佳答案
这对我有用:
public class AndThenTest {
Integer value;
@Test
public void test() {
getFromLocal()
.switchIfEmpty(getFromNetwork()
.flatMapCompletable(v -> saveFoo(v))
.andThen(getFromLocal()))
.doOnSuccess(e -> System.out.println("Success: " + e))
.test()
.awaitDone(5, TimeUnit.SECONDS)
.assertResult(10);
}
Maybe<Integer> getFromLocal() {
return Maybe.fromCallable(() -> {
System.out.println("FromLocal called");
return value;
});
}
Single<Integer> getFromNetwork() {
return Single.fromCallable(() -> {
System.out.println("FromNetwork called");
return 10;
}).delay(100, TimeUnit.MILLISECONDS)
;
}
Completable saveFoo(Integer v) {
return Completable.fromRunnable(() -> {
System.out.println("SaveFoo called");
value = v;
});
}
}
并打印:
FromLocal called
FromNetwork called
SaveFoo called
FromLocal called
Success: 10
所以我的猜测是您没有展示的其中一种方法有误。
关于android - AndThen 在可完成完成之前执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45834989/