在rxjs中限制执行平面图-angular 5

时间:2018-08-13 15:33:17

标签: angular rxjs flatmap

在rxjs中,我想对多个平面图进行条件处理,因此我不执行第二个和第三个平面图,而是直接进入subscribe:

this.authenticationAPI.getUser()
       .flatmap(response1 => if(response1 != null) // I want to go directly to subscribe
       .flatmap(response2 => return observable2(response2))
       .flatmap(response3 => return observable3(response3))
       .subscribe(response 4 => console.log(response4));

我考虑过将null的可观察变量传递给第二和第三平面图,但是还有其他解决方案吗?

2 个答案:

答案 0 :(得分:4)

您应该将情况分为两种:使用filter的失败和成功。这种方式更具声明性,更易于阅读

const response$ = this.authenticationAPI.getUser();

// failure
response$
  .filter((res) => !res)
  .subscribe(() => {
    console.log('Unauthentication')
  });

// success
response$
  .filter((res) => res)
  .flatmap(response2 => return observable2(response2))
  .flatmap(response3 => return observable3(response3))
  .subscribe(response 4 => console.log(response4));

答案 1 :(得分:2)

最好通过稍微嵌套平面图来获得最好的服务-本示例使用RxJS 5.5 / 6“管道”运算符,如果您使用的是RxJS的早期版本,则需要对此稍作翻译以映射到较旧的版本语法(如果需要请添加注释,我将添加一个示例):

this.authenticationAPI.getUser().pipe(
    map((response1) => {
        if (response1 != null) return of(response1);
        else return of(response1).pipe(
            flatMap((response2) => observable2(response2)),
            flatMap((response3) => observable3(response3))
        )
    })
).subscribe(response1or4 => console.log(response1or4));