How to properly chain rxjs 6 observables?

前端 未结 3 1048
囚心锁ツ
囚心锁ツ 2021-01-12 17:40

Any suggestions, how this can be rewritten in more promise-chaining style?:

this.apiService.sendPutRequest(\'/api/users/activate\', usrObj).pipe(
        map         


        
相关标签:
3条回答
  • 2021-01-12 18:26

    use SwitchMap for that.

    mainApiCall.pipe(
        switchMap(result=>secondApiCall(result)),
        switchMap(resultFromSecondApiCall=>thirdApiCall(resultFromSecond))
    ...
    and so on
    )
    
    0 讨论(0)
  • 2021-01-12 18:27

    You can use switchMap for handling observables and tap for side efects handling. And you need to subscribe because it's cold observable

    For error handling use catchError for all requests

    this.apiService.sendPutRequest('/api/users/activate', usrObj).pipe(
        catchError(err=> this.errorHandler(err)),
        switchMap(() => this.apiService.sendGetRequest('/api/users/' + this.currentUserId)
            .pipe(catchError(err=> this.errorHandler(err)))
        ),
        tap(data => this.setActiveUser(data)),
        switchMap(() => this.apiService.sendGetRequest('api/tasks/user/' + this.currentUserId)
            .pipe(catchError(err=> this.errorHandler(err)))
        ),
        tap(tasks => this.taskService.setCurrentUserTasks(tasks))
    ).subscribe()
    
    0 讨论(0)
  • 2021-01-12 18:39

    Use a single pipe for your problem. Just comma seperate different chainable operators like map, switchMap, mergeMap, tap, etc.

    this.apiService.sendPutRequest('/api/users/activate', usrObj).pipe(
      switchMap((results) => this.apiService.sendGetRequest('/api/users/' + this.currentUserId)),
      tap((results) => this.setActiveUser(data)),
      switchMap(() => this.apiService.sendGetRequest('api/tasks/user/' + this.currentUserId)),
      tap((results) => this.taskService.setCurrentUserTasks(tasks))
    );
    

    Simplified: Use map if you just want to transform a value without any async api calls and pass it to another operator or a subscription, tap if you just want to catch values in between without transforming (e.g. for logging). And switchMap for dispatching additional api calls.

    0 讨论(0)
提交回复
热议问题