Javascript 如何使用RxJS执行和获取连续HTTP调用的结果
我想按顺序进行几个HTTP调用,在每次调用之后,我想检查结果并进行另一次调用并显示消息,等等。在某些情况下,会继续进行下一次调用,在某些情况下,会在显示消息后中断该调用。另一方面,我还需要对每个调用使用Javascript 如何使用RxJS执行和获取连续HTTP调用的结果,javascript,angular,typescript,rxjs,Javascript,Angular,Typescript,Rxjs,我想按顺序进行几个HTTP调用,在每次调用之后,我想检查结果并进行另一次调用并显示消息,等等。在某些情况下,会继续进行下一次调用,在某些情况下,会在显示消息后中断该调用。另一方面,我还需要对每个调用使用catchError块(或者对所有调用使用单个块,但对每个调用使用一个块会更好) 因此,假设我有一个create、update和delete调用,如下所示。如何获取每个调用的响应并检查响应,然后执行另一个调用 我已经尝试了switchMap和iif,我正在寻找使用其中一个的解决方案。有什么建议吗
catchError
块(或者对所有调用使用单个块,但对每个调用使用一个块会更好)
因此,假设我有一个create、update和delete调用,如下所示。如何获取每个调用的响应并检查响应,然后执行另一个调用
我已经尝试了switchMap
和iif
,我正在寻找使用其中一个的解决方案。有什么建议吗
this.service.create('/api/employee').subscribe(resp1 => {
this.service.update('/api/salary/', id).subscribe(resp2 => {
this.service.delete('/api/education/', id).subscribe(resp3 => {
// I need to get response of each call from starting thr first and then continue of
// break according to the condition of the response
});
});
使用
switchMap
这里有一个很好的方法:
this.service.create('/api/employee')
.pipe(switchMap((resp) => {
if(fulfillsCondition(resp)) {
return this.service.update(...);
}
return this.service.delete(...);
})).subscribe();
使用
switchMap
这里有一个很好的方法:
this.service.create('/api/employee')
.pipe(switchMap((resp) => {
if(fulfillsCondition(resp)) {
return this.service.update(...);
}
return this.service.delete(...);
})).subscribe();
我不确定这里还有什么要说的 可能需要注意的是,
EMPTY
是一个RxJs流,它不发出任何东西,并且立即完成。这有点像“中断”(以一种非常松散的方式。如何从流中“中断”可能非常依赖于上下文)
更新
使用点击
帮助理解流
tap
是一个返回其接收的相同流的操作符。它不能对您的流进行任何更改,但它可以查看在任何给定点发生的情况。这是帮助您理解的有用工具
http1().pipe(
tap({
next: val => console.log("Result from http1 call: ", val),
complete: () => console.log("http1 call completed"),
error: err => console.log("http1 call errored: ", err)
})
switchMap(val => http2(val).pipe(
tap({
next: val => console.log("Result from http2 call: ", val),
complete: () => console.log("http2 completed"),
error: err => console.log("http2 call errored: ", err)
})
)),
tap({
next: val => console.log("Result from switchMap operator: ", val),
complete: () => console.log("switchMap completed"),
error: err => console.log("switchMap (http1 or http2 call) errored: ", err)
})
).subscribe()
在这里,我们可以看到开关映射前后发生的情况。您可以看到,在本例中,switchMap从http1获取一个值,并从http2发出这些值
因为switchMap在生成http2之前等待来自http1的值,所以一个副作用是http2直到http1发出之后才启动。这确实意味着这些调用是按顺序执行的,但如果http1发出不止一次,情况会变得更加复杂
更多关于:
我不确定这里还有什么要说的
可能需要注意的是,
EMPTY
是一个RxJs流,它不发出任何东西,并且立即完成。这有点像“中断”(以一种非常松散的方式。如何从流中“中断”可能非常依赖于上下文)
更新
使用点击
帮助理解流
tap
是一个返回其接收的相同流的操作符。它不能对您的流进行任何更改,但它可以查看在任何给定点发生的情况。这是帮助您理解的有用工具
http1().pipe(
tap({
next: val => console.log("Result from http1 call: ", val),
complete: () => console.log("http1 call completed"),
error: err => console.log("http1 call errored: ", err)
})
switchMap(val => http2(val).pipe(
tap({
next: val => console.log("Result from http2 call: ", val),
complete: () => console.log("http2 completed"),
error: err => console.log("http2 call errored: ", err)
})
)),
tap({
next: val => console.log("Result from switchMap operator: ", val),
complete: () => console.log("switchMap completed"),
error: err => console.log("switchMap (http1 or http2 call) errored: ", err)
})
).subscribe()
在这里,我们可以看到开关映射前后发生的情况。您可以看到,在本例中,switchMap从http1获取一个值,并从http2发出这些值
因为switchMap在生成http2之前等待来自http1的值,所以一个副作用是http2直到http1发出之后才启动。这确实意味着这些调用是按顺序执行的,但如果http1发出不止一次,情况会变得更加复杂
更多关于:
感谢您的回复,看起来不错,我会尽快尝试。但是catchError
块呢?我还需要使用它们捕获错误,并在catchError
块中添加一个if块。你能不能也加一个空的if(因为通常我会遇到void错误,最好能在你的帮助下看到正确的用法:)你介意更新一下我最后的评论吗?这似乎很有效,但我需要在每个调用的正确位置执行catchError((err:any)=>{…}
(每次调用使用单个catch块也可以。请您更新代码以执行此操作,好吗?提前谢谢。我有一些与此方法相关的问题:1我认为返回空
或返回从不
ara用于在任何点完成流。这是真的吗?2.如果我们想让流继续,该怎么办在switchMap
块中?3.据我所知,switchMap
的想法是按顺序执行HTTP调用,并在其块中进行一些操作和错误处理。这是真的吗?感谢您的回复,它似乎很好,我会尽快尝试。但是catchError
块呢?我还需要使用它们来解决问题捕获错误并在该catchError
块中添加一个if块。您是否可以通过添加一个空if来添加该块(因为通常我会遇到void错误,最好在您的帮助下查看正确用法:)你介意更新一下我的最后一条评论吗?敬请。这似乎有效,但我需要在每个调用的正确位置执行catchError((err:any)=>{…}
(每次调用使用单个catch块也可以。请您更新代码以执行此操作,好吗?提前谢谢。我有一些与此方法相关的问题:1我认为返回空
或返回从不
ara用于在任何点完成流。这是真的吗?2.如果我们想让流继续,该怎么办在switchMap
块中?3.据我所知,switchMap
的想法是按顺序执行HTTP调用,并在其块中进行一些操作和错误处理。这是真的吗?投票通过了,但无论如何,我无法使其工作。但我认为我犯了一个错误。我有一些问题,与这种方法有关:1我认为 return EMPTY
或return NEVER
用于在任意点完成流的ara。这是真的吗?2.如果我们想让流在switchMap
块中继续,该怎么办?3.据我所知,switchMap
的思想是按顺序执行HTTP调用,并在其内部进行一些操作和错误处理阻塞。这是真的吗?NEVER
和EMPTY
都不会发出任何值。NEVER
是一个永远“存在”的流。它永远不会完成和消失