Return 可观察位首先在 Angular 11 / RxJS 7 中获取新令牌
Return observable bit first get new token in Angular 11 / RxJS 7
我在 Angular / RxJS 的疯狂压力下尝试学习它真的很艰难!
如果我 returning 这个 Observable:
return this.apiProvider.Tracker(parameters).map((res: any) => {
let response = res.Result;
return response;
}).catch(error => {
this.presentToast('An error has occurred. If this problem persists, please contact us.', false);
let res: ConsentResponse = null
return Observable.of(res);
});
它工作得很好。 Tracker函数就是简单的http.postreturn,像这样:
Tracker(params) {
I NEED TO GET A NEW TOKEN HERE FIRST BY DOING ANOTHER POST REQUEST - and that is my question :-)
var auth = 'Bearer ' + localStorage.getItem("pptoken");
const requestHeaders = {
'Authorization': auth,
'Content-Type': 'application/json'
}
var data = JSON.stringify({
uid: params.uid,
Type: params.type
});
return this.http.post('https://' +
params.apiBaseUrl + '/Tracker/api/Track/Consented/', data, { 'headers': requestHeaders });
}
所以一切正常。
但是,我确实需要在每次调用 Tracker() 之前获取一个新令牌。我如何调用 GetNewToken() 并等待它完成,然后使用新令牌执行 Tracker()?每次我这样做时,我都会收到一个错误 .map() 不支持 void - 我的理解是因为我首先尝试获取令牌,然后 return 来自 Tracker() 的值,这显然不是'这是正确的方法 - 但我不知道以我有限的知识如何在 Observable Tracker() 调用该函数时首先获取令牌...
非常感谢任何帮助。
我觉得它不像 RxJS 7,因为你没有使用 pipe
来链接运算符。无论如何,要映射可观察对象,您需要使用 switchMap
,如下所示:
getTracker(params): Observable<any> {
return getNewToken().pipe(switchMap(token => {
// fill headers and data
return this.http.post(url, data, { 'headers': requestHeaders });
}));
}
或者没有管道,以防你使用的是旧版本的 RxJS:
getTracker(params): Observable<any> {
return getNewToken().switchMap(token => {
// fill headers and data
return this.http.post(url, data, { 'headers': requestHeaders });
});
}
我在 Angular / RxJS 的疯狂压力下尝试学习它真的很艰难!
如果我 returning 这个 Observable:
return this.apiProvider.Tracker(parameters).map((res: any) => {
let response = res.Result;
return response;
}).catch(error => {
this.presentToast('An error has occurred. If this problem persists, please contact us.', false);
let res: ConsentResponse = null
return Observable.of(res);
});
它工作得很好。 Tracker函数就是简单的http.postreturn,像这样:
Tracker(params) {
I NEED TO GET A NEW TOKEN HERE FIRST BY DOING ANOTHER POST REQUEST - and that is my question :-)
var auth = 'Bearer ' + localStorage.getItem("pptoken");
const requestHeaders = {
'Authorization': auth,
'Content-Type': 'application/json'
}
var data = JSON.stringify({
uid: params.uid,
Type: params.type
});
return this.http.post('https://' +
params.apiBaseUrl + '/Tracker/api/Track/Consented/', data, { 'headers': requestHeaders });
}
所以一切正常。
但是,我确实需要在每次调用 Tracker() 之前获取一个新令牌。我如何调用 GetNewToken() 并等待它完成,然后使用新令牌执行 Tracker()?每次我这样做时,我都会收到一个错误 .map() 不支持 void - 我的理解是因为我首先尝试获取令牌,然后 return 来自 Tracker() 的值,这显然不是'这是正确的方法 - 但我不知道以我有限的知识如何在 Observable Tracker() 调用该函数时首先获取令牌...
非常感谢任何帮助。
我觉得它不像 RxJS 7,因为你没有使用 pipe
来链接运算符。无论如何,要映射可观察对象,您需要使用 switchMap
,如下所示:
getTracker(params): Observable<any> {
return getNewToken().pipe(switchMap(token => {
// fill headers and data
return this.http.post(url, data, { 'headers': requestHeaders });
}));
}
或者没有管道,以防你使用的是旧版本的 RxJS:
getTracker(params): Observable<any> {
return getNewToken().switchMap(token => {
// fill headers and data
return this.http.post(url, data, { 'headers': requestHeaders });
});
}