使用 Angular / RXJS 一个接一个地发送两个 HTTP 请求,其中第二个请求需要第一个请求?

Sending two HTTP Requests one after each other using Angular / RXJS where second request requires the first?

目前我的代码是通过将 observables 嵌套在彼此内部...

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

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

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

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

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

非常感谢,

使用 flatMap 或 switchMap 并有条件地 return 不同的 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()
}

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

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

我想你可以使用 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 模式来做到这一点