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

如何使用RxJava Observable。zip,如果只有一个可观察的参数存在

督俊雅
2023-03-14

H

对不起,我是RxJava的新手,有一个关于如何使用rx的问题。可观察到的。

这是我的密码

final Observable<SomeData> data1 =
         getData(...);
final Observable<SomeData> data2 =
         getData(...);                    
final Observable<SomeData> data3 =
         getData(...);

            return Observable.zip(
                    data1,
                    data2,
                    data3,
                    new Func3<SomeData, SomeData, SomeData, SomeData>() {
                        @Override
                        public SomeData call(
                                final SomeData d1,
                                final SomeData d2,
                                final SomeData d3) {
                            //do something and return SomeData
                        }
                    });

在这里,当所有数据都存在时,我使用zip。

我的问题是,如果data2和data3不存在(即,它们都为空),我不/不应该使用Observable。zip发出函数并获取返回值,那么当我只有data1时应该怎么做?如果我只接受一个参数(data1),我应该使用哪个API?此外,我还必须返回一些数据,而不是函数中的可观察数据。

任何帮助将不胜感激!

共有2个答案

郎弘壮
2023-03-14

您可以使用Observable.combineLatest()而不是zip(),并将. start with()添加到可以为空而不会发出任何东西的可观察对象。所以在你的情况下,就像:

Observable.combineLatest(
    data1, 
    data2.startWith(/*some value*/),
    data3.startWith(/*some value*/),
    new Func3<SomeData, SomeData, SomeData, SomeData>() {
        @Override
        public SomeData call(
            final SomeData d1,
            final SomeData d2,
            final SomeData d3) {
                //do something and return SomeData
        }
    });
宋华灿
2023-03-14

当只有第一个参数的数据时,不能真正应用相同的3参数函数,但可以使用sentinel值告诉函数没有参数2和3的数据:

static final SomeData NOT_PRESENT = new SomeData(null, ...); 

void Observable<OutputType> process(Observable<SomeData> data1,
       Observable<SomeData> data2, Observable<SomeDatat> data3) {
    Func3<SomeData, SomeData, SomeData, OutputType> f3 = (a, b, c) -> {

        if (b == NOT_PRESENT) {
        }
        // process the data and return an OutputType
        return ...
    };

    if (data2 != null && data3 != null) {
        return Observable.zip(data1, data2, data3, f3);
    }

    return data1.map(v -> f3.call(v, NOT_PRESENT, NOT_PRESENT));
}
 类似资料:
  • 我来自同步编程背景,我很难理解可观察性。 这是我的服务/提供商的摘录(离子2项目) 我将从订阅它。关于这一点,我有几个问题。 > 即使我没有声明,上面的代码是否返回一个可观察/观察者? 响应是JSON。如何检查/处理JSON并执行一些操作,如 那就做吧 我认为应该在提供者类中完成。只是一个典型的提示/例子将是真棒。 当请求到达subscribe方法时,它是否真的发生了? 创建和返回Angular

  • 在一个服务中,我有两个API调用,每个调用都返回一个可观察的,在我的组件中,我有一些条件,如果为true,我必须调用这两个函数,但我需要等待get()调用,这样我就可以使用get调用返回的参数执行post函数。如果为false,我只想用已经定义的参数调用post函数。 服务: 组成部分: 我不想重复帖子调用的代码,或者如果不可能的话,只是不要在另一个订阅()中使用订阅()。我怎么能这么做?没有异步

  • 我正在使用mat-table,并试图将MatTableDataSource与observable一起使用(我从web服务获取数据),但我不知道如何将MatTableDataSource配置为使用observable而不是数组。 这个问题的唯一解决方案是订阅ngOnInit方法中的observable并在新数据到达时始终创建新的MatTableDataSource吗?

  • 我有一个组件订阅服务中的一个可观察对象。该方法反过来订阅另一个服务中的可观察对象。我想将一个数组从最后一个服务传递回第一个服务,然后第一个服务将该数组传递回组件。更具体地说,该组件调用其本地服务,然后调用一个数据服务,该数据服务通过http客户端访问我的数据库。http客户端正在工作,数据服务将数组返回给本地服务。本地服务接收数组,但我不知道如何将该数组作为可观察对象传递回组件。以下是简短的代码块

  • 我通过几个步骤完成了这一过程(我对原始数据进行了子集,只按组进行第一次观察,给VAR_1赋一个特殊值,重新合并,然后最后按特殊值进行过滤),但我想知道是否有更简单、更优雅(可能也是)更有效的方法。我不需要VAR_1,所以如果需要,可以更改VAR_1,以提供更快的解决方案。 如有任何帮助,不胜感激。

  • 在使用RxJs时,一个非常常见的问题似乎是希望一个或多个观测值的结果在后续的观测值中使用它们。 e、 g.在伪代码中(这不是rx或有效的js语法) 这可以通过一种丑陋的方式来实现,你可以订阅这两个网站,然后在另一个网站中调用其中一个。。然而,这是非常混乱的,不能给你太多的灵活性。 例如(真实语法) 这也意味着,当您完成这两个可观察的内容时,没有任何其他内容可以轻松地使用此流。 我的特定用例需要以下