RxJs堆栈可观察量

时间:2017-06-12 15:01:34

标签: rxjs

我试图降低应用程序中的行数,但我无法让我的可观察量工作......

所以我有以下情况:

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 (): 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
}

但事实并非如此,它是Observable openDialog,永远不会完成/完成。我有什么想法可能做错了吗?

1 个答案:

答案 0 :(得分:1)

嗯,这条线看起来很可疑:

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

为什么你想要创建一个新的observable而你已经拥有一个:handleDialogResult返回的那个?

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

您的代码看起来像这样

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

如果流是包含其他流的流(正如您的flatMap建议的那样),那么您还需要使用switch运算符展平流

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