使用 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 模式来做到这一点
目前我的代码是通过将 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 模式来做到这一点