Ошибка : 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));
}));
}
}
Оставит вопрос открытым для ответов, если есть способ заставить это работать с декоратором.