如何正确链接 rxjs 6 observables?

ask*_*ona 8 observable rxjs angular rxjs6

任何建议,如何以更多的承诺链风格重写?:

this.apiService.sendPutRequest('/api/users/activate', usrObj).pipe(
        map(() => {
            return this.apiService.sendGetRequest('/api/users/' + this.currentUserId).pipe(
                map(data => {
                    return this.setActiveUser(data).pipe(
                        map(() => {
                            return this.apiService.sendGetRequest('api/tasks/user/' + this.currentUserId).pipe(
                                map(tasks => {
                                    return this.taskService.setCurrentUserTasks(tasks);
                                })
                            );
                        })
                    );
                })
            );
        })
    );
Run Code Online (Sandbox Code Playgroud)

Ant*_*sss 9

使用SwitchMap了点。

mainApiCall.pipe(
    switchMap(result=>secondApiCall(result)),
    switchMap(resultFromSecondApiCall=>thirdApiCall(resultFromSecond))
...
and so on
)
Run Code Online (Sandbox Code Playgroud)

  • 此代码示例中的命名选择具有描述性,有助于我快速理解链接在一起。这让我能够快速将各种 api 调用链接在一起。干杯! (2认同)

Kli*_* Ru 8

您可以使用switchMap处理观测和自来水的侧efects处理。你需要订阅,因为它是冷可观察的

对于错误处理,对所有请求使用catchError

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()
Run Code Online (Sandbox Code Playgroud)

  • 当粉碎一个可观察的整个流时,会出现一个 catchError 。在这个解决方案中,当一个 observable 被压碎时,您可以获得部分数据。例如,当 `this.apiService.sendGetRequest('/api/users/' + this.currentUserId)` 返回错误流将继续时,您可以获得 `this.apiService.sendGetRequest('api/tasks/user/' + this.当前用户 ID)` (2认同)

ngf*_*ixl 8

使用单个pipe解决您的问题。只需用逗号分隔不同的可链接运算符,例如map, switchMap, mergeMap,tap等。

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))
);
Run Code Online (Sandbox Code Playgroud)

简化:map如果您只想在不进行任何异步 api 调用的情况下转换值并将其传递给另一个运算符或订阅,tap如果您只想捕获中间的值而不进行转换(例如用于日志记录),请使用。并switchMap用于调度额外的 api 调用。