我的AuthService中具有以下功能:

getToken() {
  this.http.post('myAuthEndpoint', { credentials })
  .subscribe((res) => {
    const token = res.headers.get('Authorization')
    localStorage.setItem('id_token', token);
  });
}


我想从getToken()返回在.subscribe中返回的实际令牌值。有没有办法做到这一点?

最佳答案

如果在令牌可用时需要采取其他措施,则可以执行以下操作:

getToken() {
  return this.http.post('myAuthEndpoint', { credentials })
  .map((res) => {
    const token = res.headers.get('Authorization')
    return token;
  })
  .do((token) => {
    localStorage.setItem('id_token', token);
  });
}

// some other part of app
authService.getToken()
  .switchMap((token) => {
    // perform any desired action
  })
  .subscribe((result) => ...);


但是请注意,在这种情况下,在没有后续getToken()的情况下调用subscribe不会执行任何操作。

回答评论

您有两种服务,一种提供令牌,另一种使用令牌:

export class AuthService {
  private tokenSource = new ReplaySubject(1);
  private token$ = this.tokenSource.asObservable();

  constructor(private http: Http) {
    return this.http.post('myAuthEndpoint', { credentials })
    .map((res) => {
      let token = res.headers.get('Authorization')
      return token;
    })
    .do((token) => {
      localStorage.setItem('id_token', token);
    })
    .subscribe(this.tokenSource);
  }

  getToken() {
    return this.token$;
  }
}

export class RecentPhotosService {
  constructor(private authService: AuthService) {
    this.authService.getToken()
      .switchMap(token => {
        return this.getRecentPhotos(token);
      })
      .subscribe(photos => {...});
  }

  ...
}

关于javascript - 有没有办法将数据从我的angular2服务中的.subscribe传递出去?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41273599/

10-12 00:17