如何顺序和有条件地反应编程?

时间:2017-04-13 15:06:13

标签: angular rxjs reactive-programming

我想按顺序和有条件地执行两个或多个操作。操作应该按顺序执行。以下示例已经可以执行此操作。

但我做不到。根据第一次操作的结果,我想决定第二次操作是否应该起作用。根据第一个操作的结果,我想将参数传递给第二个操作。

我知道如果代码在订阅事件范围内写入,它可以工作。但它必须按顺序工作,第一个操作响应将影响第二个操作请求。同时,另外第三个操作可以添加到' concat'第一次和第二次操作的反应与'concat'运营商。同时,我想使用相同的变量上下文。我们该怎么办?

        var first: Observable<any> = this.http.get("https://testdb.firebaseio.com/.json").do((result1: any) => {
            //to do something with result1
            console.log("first operation");
        });

        var second: Observable<any> = this.http.get("https://testdb.firebaseio.com/.json").do((result2: any) => {
            ////to do something with result2
            console.log("second operation");
        });

        first.concat(second).subscribe();

1 个答案:

答案 0 :(得分:1)

您可以使用switchMapconcatMapmergeMap(或者如果您使用的是rxjs4:flatMap)执行此操作 - 如有疑问:请使用switchMap

    const first$ = this.http.get("https://testdb.firebaseio.com/.json").do((result1: any) => {
        //to do something with result1
        console.log("first operation");
    });

    const second$ = this.http.get("https://testdb.firebaseio.com/.json").do((result2: any) => {
        ////to do something with result2
        console.log("second operation");
    });

    first$
        .switchMap(result1 => {
            if (resultIsOkay(result1)) {
                return second$;
            } else {
                return Observable.empty();
                // alternatively: return Observable.of(result1);
            }
        })
        .subscribe();