RxJs堆栈可观测值

RxJs堆栈可观测值,rxjs,Rxjs,我试图在应用程序中降低我的行数,但我无法让我的观测值工作 因此,我有以下场景: let openDialog = function (): Observable<any> { // some logic that defines x let x = 0; // return return Observable.create(observable => { this.handleDialogResult(x).subscribe

我试图在应用程序中降低我的行数,但我无法让我的观测值工作

因此,我有以下场景:

let openDialog = function (): Observable<any> {
    // some logic that defines x
    let x = 0;

    // return
    return Observable.create(observable => {

        this.handleDialogResult(x).subscribe(
            () => {
                observable.next();
                observable.complete();
            },
            e => {
                observable.error(e);
                observable.complete();
            }
        )
    });
}


let handleDialogResult = function (x): Observable<any> {
    switch (x) {
        case 1:
            return this.doMagic('Magic1');
        case 2:
            return this.doMagic('Magic2');
    }
}


let doMagic = function (x): Observable<any> {
   // some magic
}
let openDialog=function():可观察{
//定义x的一些逻辑
设x=0;
//返回
返回Observable.create(Observable=>{
此.handleDialogResult(x).订阅(
() => {
可观察的。下一步();
可观察的,完全的;
},
e=>{
可观测误差(e);
可观察的,完全的;
}
)
});
}
让handleDialogResult=函数(x):可观察{
开关(x){
案例1:
返回此.doMagic('Magic1');
案例2:
返回此.doMagic('Magic2');
}
}
设doMagic=函数(x):可观测{
//一些魔法
}
然后,当您执行以下操作时,我会认为我获得了相同的功能:

let openDialog = function (): Observable<any> {
    // some logic that defines x
    let x = 0;

    // return
    return Observable.create(observable => {
        this.handleDialogResult.flatMap(observable)
    });
}


let handleDialogResult = function (x): Observable<any> {
    switch (x) {
        case 1:
            return this.doMagic('Magic1');
        case 2:
            return this.doMagic('Magic2');
    }
}


let doMagic = function (x): Observable<any> {
   // some magic
}
let openDialog=function():可观察{
//定义x的一些逻辑
设x=0;
//返回
返回Observable.create(Observable=>{
此.handleDialogResult.flatMap(可观察)
});
}
让handleDialogResult=函数(x):可观察{
开关(x){
案例1:
返回此.doMagic('Magic1');
案例2:
返回此.doMagic('Magic2');
}
}
设doMagic=函数(x):可观测{
//一些魔法
}

但事实并非如此,它是可观察的openDialog,永远不会完成。你知道我做错了什么吗

嗯,这条线看起来可疑:

return Observable.create(observable => {
    this.handleDialogResult.flatMap(observable)
});
既然已经有了一个可观察对象,为什么还要创建一个新的可观察对象:由
handleDialogResult
返回的对象

我不确定我是否完全理解您的代码应该做什么,但是为了让流在第一个值发出时结束(这是您的初始代码似乎正在做的),您只需要
获取一个值

您的代码如下所示

return this.handleDialogResult(x).take(1)
如果流是包含另一个流的流(如
flatMap
所示),则还需要使用
开关
操作符展平流

return this.handleDialogResult(x).switch().take(1)

为什么需要
flatMap
流。它看起来不像一条小溪