如何在没有嵌入式订阅的情况下一个接一个地执行异步操作

How to perform one async action after another without embedded subscriptions

我想使用 rxjs 一个接一个地执行异步操作。我知道在订阅中嵌入订阅不是一个好的做法,还有一些其他的 rxjs 运算符(flatMap\mergeMap、do 等使用 pipe).

我需要获取组件查询参数,设置一个全局变量 (globalVar),然后,继续下一个异步操作 (this..doSomething())。 这是我使用嵌入式订阅的代码: *doSomething return 可观察

this.route.paramMap.subscribe(params => 
    { 
      globalVar = + params['userId']; 
      this.<someService>.doSomething().subscribe(result => 
      {
        this.func1();
      });
    }

Async/await 将是一种使您的代码以可以顺序读取的方式可读的方法。在我还尝试在几个级别上嵌入 observable 之后,这是我的首选路线。

对于要链接多个可观察对象的情况,一个完美的解决方案是 switchMap 运算符。

this.route.paramMap
    .pipe(
      switchMap(params) => {
      globalVar = + params['userId']; 
      return this.<someService>.doSomething()
    })
    .subscribe(result=> {this.func1();})

switchMap 将做的事情是在从 this.route 获取参数后,它将 return 一个新的可观察对象,您可以稍后订阅。在这种情况下使用 switchMap 的好处是,如果在处理 this.<someService>.doSomething()this.route.paramMap 内部发生更改,rxjs 将终止正在处理的请求并启动新请求,通过这样做 subscribe 内的 result 中的日期将始终与 paramMap.

的当前值相关
this.route.paramMap.pipe(
  switchMap(params => {
    globalVar = + params['userId'];
    return this.<someService>.doSomething().pipe(
      tap(() => this.func1())
    )
  })
).subscribe();