RXJava顺序执行可观察

RXJava顺序执行可观察,java,rx-java,rx-java3,Java,Rx Java,Rx Java3,我有多个函数返回一个可观察的。每个函数在文件系统上执行命令。我需要一个接一个地执行每个函数,并在可观察的对象中获得函数的输出。最后,我想要一个可观察的,它按照函数调用的顺序包含所有函数的输出 单独地,每个函数都按预期工作,但我需要正确地合并输出 我已经尝试过可观察。concatArray(func1,func2,…)如下: return Observable.concatArray( func1(), func2(), func3(),

我有多个函数返回一个可观察的
。每个函数在文件系统上执行命令。我需要一个接一个地执行每个函数,并在可观察的对象中获得函数的输出。最后,我想要一个可观察的
,它按照函数调用的顺序包含所有函数的输出

单独地,每个函数都按预期工作,但我需要正确地合并输出

我已经尝试过可观察。concatArray(func1,func2,…)如下:

    return Observable.concatArray(
        func1(),
        func2(),
        func3(), 
        func4()
    );
但这只是保留了可观测事件的顺序。而不是函数的顺序。我的意思是如果func1发出事件A,而A'et func2发出B和B',我将有A->A'->B->B'。但是func2将在func1之后立即启动。这导致我的问题是func1需要在func2启动之前完成

第一个函数是通过maven在文件系统上生成目录。因此,这是一项长期任务。第二,在这个目录中写入一个文件。但是concatArray在第一次发射后立即发射第二次。命令失败,因为此时目录不存在

有没有办法避免这样丑陋的事情:

Subject<String> result = PublishSubject.create();
Observable<String> func1Obs = funct1(); 
Observable<String> func2Obs = funct2(); 

func1Obs.subscribe(output -> result.onNext(output));
func1Obs.onDoComplete(() -> {
    func2Obs.subscribe(output -> result.onNext(output);
}
return result;
Subject result=PublishSubject.create();
可观测func1Obs=funct1();
可观测的func2Obs=funct2();
funct1obs.subscribe(输出->结果.onNext(输出));
函数1obs.onDoComplete(()->{
func2Obs.subscribe(输出->结果.onNext(输出);
}
返回结果;

正如Progman建议的那样,错误不在concatArray中,这是要使用的方法。问题是,在我的函数列表中,我使用的是这种代码:

public Observable<String> func1() {
    Subject<String> result = PublishSubject.create();
    String output = dosomething()
    result.onNext(output);
}
可观察的.defer()
,如果您只需要等待订阅:

public Observable<String> func1() {
    // See how we wrap our instruction inside create method
    return Observable.defer( () -> dosomething());
}

请在你的问题中包含观察对象的详细示例,以及你希望从中读取它们的顺序。还请详细解释为什么
concat
在你的情况下不是正确的解决方案。记住-使用观察对象的全部目的是为了让你可以并行化任务。一旦你并行化了它们,它们现在就可以在任何顺序。如果您想要/需要强制执行某个顺序,您可以a)返回到串行代码,或b)使用诸如.Then()或When()之类的运算符:我将尝试第二个选项and/Then/When仅适用于RxJava 1。我使用RxJava3@Scandinave调用方法
funct2()
在调用
subscribe()
之前是否已经触发了计算(创建文件)?
public Observable<String> func1() {
    // See how we wrap our instruction inside create method
    return Observable.defer( () -> dosomething());
}
return Observable.concatArray(
    func1(),
    func2(),
    func3(), 
    func4()
);