Javascript 仅当';完成了

Javascript 仅当';完成了,javascript,angular,typescript,rxjs,observable,Javascript,Angular,Typescript,Rxjs,Observable,我使用rxjs,我的问题是,如果我想调用下一个函数,是否只有在可观察对象完成时才调用?因此,与此相反: this.Start(data).subscribe( (data) => { console.log('next'); }, (err) => { console.log('err'); }, () => { console.log('complete'); this.

我使用rxjs,我的问题是,如果我想调用下一个函数,是否只有在可观察对象完成时才调用?因此,与此相反:

this.Start(data).subscribe(
    (data) => {
        console.log('next');
    },
    (err) => {
        console.log('err');
    },
    () => {
        console.log('complete');

        this.nextFunction()   // this return with other observable
        .subscribe(
            (data) => {
                console.log('next');
            },
            (err) => {
                console.log('err');
            },
            () => {
                console.log('complete');
                this.nextFunction2(); // this returns with other observable
                .subscribe(
                    (data) => {
                        console.log('next');
                    },
                    (err) => {
                        console.log('err');
                    },
                    () => {
                        console.log('complete');
                        this.nextFunction3()
                        .subscribe(...)
                    }
                );
            }
        );
    }
);
大概是这样的:

this.Start(data).subscribe(
    (data) => {
        console.log('next');
    },
    (err) => {
        console.log('err');
    },
    () => {
        console.log('complete');
        return other observable;
    }
)
.then(
    (data) => {
        console.log('next');
    },
    (err) => {
        console.log('err');
    },
    () => {
        console.log('complete');
        return other observable;
    }
)
.then(
    (data) => {
        console.log('next');
    },
    (err) => {
        console.log('err');
    },
    () => {
        console.log('complete');
        return other observable;
    }
);
所以我不想把我的代码设计成金字塔。

你可以使用静态操作符来组成一个可观察对象,一个接一个地订阅可观察对象:

import { Observable } from 'rxjs/Observable';
import 'rxjs/add/observable/concat';
import 'rxjs/add/observable/defer';

Observable.concat(
  this.Start(data),
  Observable.defer(() => this.nextFunction()),
  Observable.defer(() => this.nextFunction2()),
  Observable.defer(() => this.nextFunction3()),
)
.subscribe();
请注意,运算符用于延迟获得子序列可观测值的调用

其中包含一些日志:

import { Observable } from 'rxjs/Observable';
import 'rxjs/add/observable/concat';
import 'rxjs/add/observable/defer';
import 'rxjs/add/operator/do';

Observable.concat(
  this.Start(data).do(
    (value) => { console.log("next: Start:", value); },
    (error) => { console.log("error: Start:", error); },
    () => { console.log("completed: Start"); }
  ),
  Observable.defer(() => this.nextFunction().do(
    (value) => { console.log("next: nextFunction:", value); },
    (error) => { console.log("error: nextFunction:", error); },
    () => { console.log("completed: nextFunction"); }
  )),
  Observable.defer(() => this.nextFunction2().do(
    (value) => { console.log("next: nextFunction2:", value); },
    (error) => { console.log("error: nextFunction2:", error); },
    () => { console.log("completed: nextFunction2"); }
  )),
  Observable.defer(() => this.nextFunction3().do(
    (value) => { console.log("next: nextFunction3:", value); },
    (error) => { console.log("error: nextFunction3:", error); },
    () => { console.log("completed: nextFunction3"); }
  )),
)
.subscribe();

谢谢,这很有效!我用concat代替concatMap,因为我不存在第二个
concatMap
是一个打字错误。我试过了,如果出现错误会发生什么。错误('hups');我在启动功能中使用了这个,我在控制台上看到了这个:“error:start:hups”和dispose,但在这之后,应用程序崩溃了,并显示以下消息:throw sink.syncErrorValue;就这些。我应该如何处理此异常以不杀死应用程序,而只是断开链?通过传递给
订阅
错误
函数处理它(在
下一个
函数之后)