【问题标题】:Sending two HTTP Requests one after each other using Angular / RXJS where second request requires the first?使用Angular / RXJS一个接一个地发送两个HTTP请求,其中第二个请求需要第一个?
【发布时间】:2017-12-15 17:14:31
【问题描述】:

目前我的代码是通过将可观察对象相互嵌套来实现的...

makeRequest() {
  return this.http.get().map((response: Response) => {
    return this.http.get(response.doSomething());
  }
}

当我需要使用它时,我也使用嵌套订阅它们......

我很确定这不是正确的方法,现在我需要一种方法来做一些事情:

-> 发出请求 -> 检查回复 -> 如果回复表明令牌已过时 -> 获取新令牌并再次请求 -> 否则将结果传递给

实现这一目标的推荐方法是什么?

非常感谢,

【问题讨论】:

    标签: angular rxjs angular-http


    【解决方案1】:

    使用 flatMap 或 switchMap 并有条件地返回不同的 Observable

    auth() {
      return this.http.get().flatMap((response: Response) => {
      if (token not expire....) {
      // pass on the response
        return Observable.of(response)
      }
        return this.http.get(response.getToken()).mapTo(Observable.throw('Retry'));
      }).retry()
    }
    

    【讨论】:

    • 无论如何我可以这样做,如果令牌过期,它会去获取令牌,然后再次发送请求并返回该响应?
    • 编辑了答案。我故意抛出一个错误,以便再次重复整个链条。
    【解决方案2】:

    我们使用mergeMap/flatMap 来迭代一个可观察对象。 mergeMap 将从内部 observable 中拉取 observable 并将其传递给父流。

     makeRequest() {
        return this.http.get().pipe(
          mergeMap(response: Response => this.http.get(response.doSomething())
        );
      }
    

    【讨论】:

      【解决方案3】:

      我觉得你可以用async.js waterfall

      async.waterfall([
       function(callback) {
         this.http.get(url1).then(res1 => {
           callback(null, res1); 
         }).catch(err => {
           callback(err);
         })
       },
       function(res1, callback) {
          this.http.get(url2).then(res2 => {
           callback(null, res2); 
         }).catch(err => {
           callback(err);
         })
       },
      ], function (err, result) {
         // result now equals res2
         // err here is the first error occure
      });
      

      这里第一个回调请求将首先发生然后第二个取决于第一个的结果,所以如果第一个失败,第二个请求将不会发生,您可以像这样链接任意数量的依赖请求

      或者你可以使用async await 模式来做到这一点

      【讨论】:

        猜你喜欢
        • 2022-11-02
        • 2019-01-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-21
        • 1970-01-01
        • 2019-09-02
        相关资源
        最近更新 更多