rxjs Поток прерван при использовании декоратора в angular 7 - PullRequest
0 голосов
/ 18 января 2019

Ошибка : e1:You provided an invalid object where a stream was expected. You can provide an Observable, Promise, Array, or Iterable.

Код :

// interceptor
@Injectable()
export class TokenInterceptor implements HttpInterceptor {
  constructor(private auth: AuthService) { }
@delayForToken()
  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    //code to augment token to request
    return next.handle(req);
  }
}
//..



// decorator
export function delayForToken(observableName: string) {
  let auth: AuthService;
  return (target, key, descriptor) => {
    if (descriptor === undefined) {
      descriptor = Object.getOwnPropertyDescriptor(target, key);
    }
    const om = descriptor.value;
    descriptor.value = function (...args) {
      auth = (!auth) ? injector.get(AuthService) : auth;
      const ags = args;
      const ths = this;
      return auth.onToken().pipe(take(1)).subscribe(() => {
        return om.apply(ths, ags);
      });
    };
    return descriptor;
  };
}
//..


//following is slightly irrelevant, adding them for completeness
//AuthService
private tokenSub = new ReplaySubject<string>(1);
constructor(private afAuth: AngularFireAuth){
  this.afAuth.idToken.subscribe((tok: string) => {
    this.tokenSub.next(tok);
  }
}
public onToken(): Observable<string> {
  return this.tokenSub.asObservable();
}
//..


//app.module
providers: [
  { provide: HTTP_INTERCEPTORS, useClass: TokenInterceptor, multi: true }]
//..


//component
this.rest.hitserver('param1').subscribe((response: RspType[]) => {
  this.rsps = response;
}, (error) => { console.log('e1:' + error); }, () => { });
//..


//app.module
providers: [
  { provide: HTTP_INTERCEPTORS, useClass: TokenInterceptor, multi: true }]

Намерение : я пытаюсь отложить запрос http, пока не получу свою настройку idToken, чтобы я мог дополнить ее запросом.

Обновление : Закончено использование аннотации только в компонентах, повторяется логика в перехватчике с switchMap (спасибо Fan Cheung ):

// @delayForToken() - Removed this annotation
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
  if (this.auth.tok) {
    return next.handle(this.addTokenToReq(req, this.auth.tok));
  }
  return this.auth.onToken().pipe(take(1), switchMap((token: string) => {
    return next.handle(this.addTokenToReq(req, this.auth.tok));
  }));
  }
}

Оставит вопрос открытым для ответов, если есть способ заставить это работать с декоратором.

...