gpt4 book ai didi

android - AndThen 在可完成完成之前执行

转载 作者:行者123 更新时间:2023-11-29 01:07:33 24 4
gpt4 key购买 nike

让我们来看两个用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com