Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用RxJS执行和获取连续HTTP调用的结果_Javascript_Angular_Typescript_Rxjs - Fatal编程技术网

Javascript 如何使用RxJS执行和获取连续HTTP调用的结果

Javascript 如何使用RxJS执行和获取连续HTTP调用的结果,javascript,angular,typescript,rxjs,Javascript,Angular,Typescript,Rxjs,我想按顺序进行几个HTTP调用,在每次调用之后,我想检查结果并进行另一次调用并显示消息,等等。在某些情况下,会继续进行下一次调用,在某些情况下,会在显示消息后中断该调用。另一方面,我还需要对每个调用使用catchError块(或者对所有调用使用单个块,但对每个调用使用一个块会更好) 因此,假设我有一个create、update和delete调用,如下所示。如何获取每个调用的响应并检查响应,然后执行另一个调用 我已经尝试了switchMap和iif,我正在寻找使用其中一个的解决方案。有什么建议吗

我想按顺序进行几个HTTP调用,在每次调用之后,我想检查结果并进行另一次调用并显示消息,等等。在某些情况下,会继续进行下一次调用,在某些情况下,会在显示消息后中断该调用。另一方面,我还需要对每个调用使用
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
      是一个永远“存在”的流。它永远不会完成和消失