Angular 在发送HTTP请求之前执行条件方法 角度链Http请求
我创建了一个服务,在那里我包装了所有HTTP请求get、put、postAngular 在发送HTTP请求之前执行条件方法 角度链Http请求,angular,http,rxjs,observable,chain,Angular,Http,Rxjs,Observable,Chain,我创建了一个服务,在那里我包装了所有HTTP请求get、put、post get(url) { const headers = new Headers(); this.sessionToken(headers); // just add the headers... return this.http.get(url, { headers: headers }); } 在发送eg.GET请求之前,如何执行方法 在我的场景中,我有一个方法返回一个令牌,这个令牌需要保存在localSt
get(url) {
const headers = new Headers();
this.sessionToken(headers); // just add the headers...
return this.http.get(url, {
headers: headers
});
}
在发送eg.GET请求之前,如何执行方法
在我的场景中,我有一个方法返回一个令牌,这个令牌需要保存在localStorage上,并按照链添加到头中
initClient() {
return this.http.post('/connect/', {})
.map(res => res.json())
}
如何在Http调用完成之前有条件地插入此请求
直接在该服务中,而不是在每次HTTP调用时订阅
下面是我试图做的:
get(url) {
if (!localStorage.getItem('token')) {
this.initClient()
.subscribe(session => {
localStorage.setItem('token', JSON.stringify(session));
});
}
const headers = new Headers();
this.sessionToken(headers);
return this.http.get(url, {
headers: headers
});
}
但是,在调用initClient之前,HTTP请求已得到解决
我需要做什么
方法返回Http请求
在发送请求之前,获取令牌/设置令牌本地存储
继续Http请求,包括标头中的令牌
可能的解决方案-错误:
@舒适的回答
类型为“session:any=>void”的参数不能分配给类型为“value:any,index:number=>observeInput”的参数。
类型“void”不可分配给类型“ObservableInput”
正在尝试将initClient{…}设置为任意类型:
initClient:any{…}前面的错误消失,但出现另一个错误:
ERROR TypeError:您在需要流的位置提供了“undefined”。您可以提供可观察的、承诺的、数组的或可观察的。您需要的是可观察的。flatMap。flatMap的行为就像。然后在承诺中
另外,针对您的问题,您可以从Observable.if获得一些帮助,以使您的代码看起来更干净。Observable.ifcondition,thenSource,[elseSource]接受3个参数。第一个参数是布尔条件,第二个参数是条件为真时要发出的可观测值,最后一个参数是else源的数组,即条件为假时要发出的可观测值
大概是这样的:
get(url) {
return Observable
.if(
//a function that returns a boolean
() => !localStorage.getItem('token'),
//an Observable to return if condition is true
this.initClient()
//use flatMap to proceed to next Observable
.flatMap(session => {
return localStorage.setItem('token', JSON.stringify(session));
}),
//an Observable to return if condition is false
//return dummy value so that Observable can continue
Observable.of('')
)
.flatMap(() => {
const headers = new Headers();
this.sessionToken(headers);
return this.http.get(url, {
headers: headers
});
})
}
现在,您可以在组件中调用geturl:
this.myService.get(API_URL)
.subscribe(response => {
console.log(response)
});
flatMap mergeMap怎么样:我试图找到解决方案,但没能找到!可观察对象似乎被以下错误停止:error TypeError:您在预期流的位置提供了“undefined”。您可以提供一个可观察的、承诺的、数组的或可观察的。我将initClient设置为any类型,而initClient的flatMap开始抱怨:类型“void”不可分配给类型“ObservableInput”。我忘了说在下一次刷新时进行了调用,我得到了数据!你认为这是怎么回事?@39ro你的浏览器很可能正在缓存旧代码!非常感谢您的代码,这是一个可观察到的错误,我的浏览器似乎与我同在!:我重新启动了Angular CLI,还清理了本地存储@39ro如果它解决了您的问题,您可以将其标记为答案。