当前位置: 首页 > 知识库问答 >
问题:

RxJava;如何同步发射可见光

巢权
2023-03-14

我想同步发射两个可观测对象(它们是异步的),一个接一个地返回第一个发射的可观测对象。如果第一个失败,则不应发出第二个。

假设我们有一个Observable可以让用户登录,另一个Observable可以在登录后自动选择用户的帐户。

这就是我所尝试的:

public Observable<AccessToken> signInAndSelectAccount(String username, String password)
{

    Observable<AccessToken> ob1 = ...; // Sign in.
    Observable<Account> ob2 = ...; // Select account.


    return Observable.zip(
            ob1,
            ob2,
            new Func2<AccessToken, Account, AccessToken>() {
                @Override
                public AccessToken call(AccessToken accessToken, Account account)
                {
                     return accessToken;
                }
            });
}

不幸的是,这不适用于我的用例。它将发出/调用两个平行的观测值,从“ob1”开始。

是否有人遇到过类似的用例?或者有没有一个想法,如何让可观测对象以同步的方式等待彼此,在那里可以返回第一次发射的数据?

提前感谢。

共有3个答案

陶树
2023-03-14

在反应式编程中没有“等待”这样的术语。您需要考虑创建一个数据流,其中一个可观察的数据流可能会被另一个数据流触发。在您的情况下,在收到令牌后,您需要接收帐户。可能是这样的:

Observable<Account> accountObservable = Observable.create(new Observable.OnSubscribe<AccessToken>() {
    @Override public void call(Subscriber<? super AccessToken> subscriber) {
        subscriber.onNext(new AccessToken());
        subscriber.onCompleted();
    }
}).flatMap(accessToken -> Observable.create(new Observable.OnSubscribe<Account>() {
    @Override public void call(Subscriber<? super Account> subscriber) {
        subscriber.onNext(new Account(accessToken));
        subscriber.onCompleted();
    }
}));
公西岳
2023-03-14

您可以使用Single。阻止同步调用的Get

// example 
signIn(name,password).blockingGet() 
狄誉
2023-03-14

您还可以使用rx.observables.Blocking观察,例如:

BlockingObservable.from(/**/).single();
 类似资料:
  • 问题内容: 我想同步地发出两个Observable对象(它们是异步的),一个接一个地返回第 一个 发出的Observable对象。如果第一个失败,则不应发出第二个。 假设我们有一个登录用户的Observable,还有一个登录 后 自动选择用户帐户的Observable 。 这是我尝试的: 不幸的是,这不适用于我的用例。它将以“ ob1”开始并行发出/调用两个可观察对象。 有人遇到过类似的用例吗?还

  • 我正在尝试创建一个RxJava BlockingObservable,它将每隔X毫秒发出一个变量的值,直到(条件==true)或超时发生。 下面的代码似乎与我想要的很接近,但它总是发出一次,然后退出。奇怪的是,我在中有一个永远不会正确的条件——我希望这个可观察到的持续发出并最终超时,但事实并非如此。 我错过了什么/做错了什么?

  • 我有一个项目列表,需要提取一些值并为每个项目调用api。为了做到这一点,我用了这样的东西_ 好吧,问题是,我不知道为什么所有的调用都是并行的。难道它不应该等待第一个响应,映射结果,然后从可观察到的对象开始下一个项目吗。from()并在最后返回responseMessages的最终列表?正在发生的是,一切都同时发生。为了证实这一点,如果我在toList方法之前加上一个延迟(1,TimeUnit.Se

  • 我正在尝试在Android环境中学习rxjava。比方说,我有一个可观察的对象,它发出网络调用的结果。如果我理解正确的话,处理配置更改的一种常见方法是: > 将可观察对象存储在保留的片段/单例/应用程序对象中 将缓存操作符应用于可观察对象 在正确的生命周期处理程序中订阅/取消订阅 这样做,我们就不会失去可观察到的结果,一旦新配置发生,将重新观察到该结果。 现在,我的问题是: 有没有办法强制可观察对

  • 组织。springframework。靴子加载器。默认情况下,Launcher将始终在launch()方法中生成一个后台线程(https://github.com/spring-projects/spring-boot/blob/master/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/lo

  • 问题内容: 我读过有关将对象标记为volatile的方法,不能保证其成员的可见性( 我不是在说线程安全,而只是在内存可见性 ,引用: JVM仅将对象引用视为易失性,而不会将驻留在堆上的对象数据本身视为易失性 我的问题: 如果成员已被编辑,则同步将确保成员(在同一锁定对象上)的可见性。那是因为 发生在锁的末尾(释放)之前, 这使得操作对其他线程可见? 在对象上使用易失性的情况下,对象引用也会更改。如