【发布时间】:2019-11-10 13:56:32
【问题描述】:
我正在学习 rxjs,目前正在尝试弄清楚如何正确地发出一系列请求。
例如,UserService 其方法之一通过用户 ID 返回用户对象。比方说,在获得对象后,我想利用它包含的信息并发出一些帖子请求,如下所示:
this.userService.getUser(5).subscribe(
user => this.userService.sendEmail(this.makeEmailMessage(user.id, user.name, user.email)).pipe(
delay(1000),
tap(() => console.log('Sending an email'))
).subscribe(
() => this.userService.sendSMS(this.makeSMSMessage(user.id, user.name, user.phone)).subscribe(
() => console.log('Sending sms')
)
)
);
但它有很多嵌套订阅,如果涉及更多请求,可能会变得不可读和难以管理。
上面的代码可以通过以下方式重写:
this.userService.getUser(5).pipe(
switchMap(
user => {
return forkJoin(
this.userService.sendEmail(this.makeEmailMessage(user.id, user.name, user.email)).pipe(
delay(1000),
tap(() => console.log('Sending a email.'))
),
this.userService.sendSMS(this.makeSMSMessage(user.id, user.name, user.phone)).pipe(
tap(() => console.log('Sending an sms'))
)
);
}
)
).subscribe(
res => console.log(res)
);
forkJoin 操作符保持请求的顺序,但短信将首先完成。如果请求顺序无关紧要,那么我认为该代码是可以的,但是如果要求保持顺序呢。
无论如何,我想知道的是,当请求顺序很重要和不重要时,处理此类构造的最佳方法是什么。另外,说到错误处理,我认为正确的方法是使用管道内的catchError 运算符(我使用tap)来处理它。对吗?
【问题讨论】:
标签: angular typescript