目前我的代码是通过将observables嵌套在彼此内...
makeRequest() {
return this.http.get().map((response: Response) => {
return this.http.get(response.doSomething());
}
}
当我需要使用它时,我也使用嵌套订阅它们......
我很确定这不是正确的方法,现在我需要一种方法来做一些事情:
- >提出请求 - >检查回复 - >如果回复表明令牌已过时 - >获取新令牌并再次执行请求 - >否则传递结果
实现这一目标的推荐方法是什么?
非常感谢,
答案 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模式执行此操作