微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 Angular 11 / RxJS 7 中首先返回可观察位获取新令牌

如何解决在 Angular 11 / RxJS 7 中首先返回可观察位获取新令牌

我在使用 Angular / RxJS 的过程中遇到了非常艰难的时刻,我试图在疯狂的压力下学习它!

如果我要返回这个 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.post 返回,像这样:

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 - 我理解这是因为我首先尝试获取令牌,然后从 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,{ 'headers': requestHeaders });
  });
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。