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

时间:2017-12-15 08:30:29

标签: angular rxjs angular-http

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

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

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

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

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

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

非常感谢,

4 个答案:

答案 0 :(得分:3)

使用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()
}

答案 1 :(得分:1)

你需要在第一个的订阅(下一个)中调用另一个。

makeRequest() {
  return this.http.get(url).map(res => res.json());
}

makeSecondRequest(req){
  return this.http.get(url).map(res => res.json());
}

req1 = this.makeRequest().subscribe((res) => {
    req2 = this.makeSecondRequest(res).subscribe(() => {
       //Do something with the second response
    })
})

还要确保取消订阅组件销毁。

ngOnDestroy(){
   this.req1.unsubscribe();
   this.req2.unsubscribe();
}

答案 2 :(得分:0)

我们使用mergeMap/flatMap迭代一个observable。 mergeMap将从内部observable中提取observable并将其传递给父流。

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

答案 3 :(得分:0)

我认为您可以使用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模式执行此操作