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)
使用SwitchMap了点。
mainApiCall.pipe(
switchMap(result=>secondApiCall(result)),
switchMap(resultFromSecondApiCall=>thirdApiCall(resultFromSecond))
...
and so on
)
Run Code Online (Sandbox Code Playgroud)
您可以使用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)
使用单个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 调用。
| 归档时间: |
|
| 查看次数: |
9440 次 |
| 最近记录: |