Ошибка: 'observableFactory не является функцией' при использовании 'defer' - PullRequest
0 голосов
/ 21 июня 2020

Я создал директиву Angular 9, которая показывает элемент HTMl, только если пользователь аутентифицирован:

<div *authenticated>
  Message for Members
</div>

И код директивы:

@Directive({
  selector: '[authenticated]'
})

export class AuthenticatedDirective implements OnInit, OnChanges {

  constructor(private template: TemplateRef<any>, private container: ViewContainerRef, private authenticationService: AuthenticationService) { }

  ngOnInit() {

    this.authenticationService.isSignedIn().subscribe(x => {
      x ? this.container.createEmbeddedView(this.template) : this.container.clear();
    });

  }

  ngOnChanges() { 

    this.authenticationService.isSignedIn().pipe(
      distinctUntilChanged()
    ).subscribe(x => {
      x ? this.container.createEmbeddedView(this.template) : this.container.clear();
    });

  }

}

Когда Я запускаю код и получаю сообщение об ошибке:

TypeError: observableFactory is not a function. (In 'observableFactory()', 'observableFactory' is an instance of ZoneAwarePromise) — defer.js:8

Я проверил метод authenticationService.isSignedIn(), и у меня есть:

isSignedIn(): Observable<boolean> {

  return defer(this.manager.getUser()).pipe(map((user: User) => !user.expired));

}

Метод this.manager.getUser() возвращает Promise<User>, поэтому я используйте defer, чтобы вернуть Observable.

Если я изменю defer на from, тогда он будет работать ...

Но не следует ли мне использовать defer?

1 Ответ

2 голосов
/ 21 июня 2020

Вы просто неправильно используете defer(). Он принимает обратный вызов как параметр, который вызывается каждый раз, когда подписывается новый наблюдатель. Когда вы используете его как defer(this.manager.getUser()), он пытается использовать возвращаемое значение из getUser() в качестве метода, что, я думаю, это не так, поэтому он выдает ошибку.

Вместо этого вы должны использовать его так:

defer(() => this.manager.getUser())

Теперь каждая новая подписка будет вызывать этот метод, и defer() будет подписываться на него. Не знаю, стоит ли вам вообще его использовать. Это зависит от того, что делает getUser() внутри. Если он всегда возвращает один и тот же Observable, вам не нужно defer. Если он возвращает разные Observables (например, делает HTTP-запрос с разными параметрами), вам нужно будет использовать defer().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...