Angular 错误:';可观测性不是一个函数';使用';推迟';
我创建了Angular 9指令,该指令仅在用户经过身份验证时显示HTMl元素:Angular 错误:';可观测性不是一个函数';使用';推迟';,angular,rxjs,observable,angular9,Angular,Rxjs,Observable,Angular9,我创建了Angular 9指令,该指令仅在用户经过身份验证时显示HTMl元素: <div *authenticated> Message for Members </div> 我检查了authenticationService.isSignedIn()方法,我有: isSignedIn(): Observable<boolean> { return defer(this.manager.getUser()).pipe(map((user: User
<div *authenticated>
Message for Members
</div>
我检查了authenticationService.isSignedIn()
方法,我有:
isSignedIn(): Observable<boolean> {
return defer(this.manager.getUser()).pipe(map((user: User) => !user.expired));
}
isSignedIn():可观察{
返回defer(this.manager.getUser()).pipe(map((user:user)=>!user.expired));
}
方法this.manager.getUser()
返回一个承诺
,因此我使用延迟
返回一个可观察的
如果我将延迟更改为从更改为,则它会工作
但是我是否应该使用
defer
?您只是用错了defer()。它将回调作为一个参数,每次新的观察者订阅时都会调用该参数。当您将它用作defer(this.manager.getUser())
时,它会尝试使用getUser()
的返回值作为方法,我想它不是,因此会抛出错误
相反,您应该这样使用它:
defer(() => this.manager.getUser())
现在,每个新订阅都将调用此方法,defer()
将订阅它。我不知道你是否应该用它。这取决于getUser()
在内部做什么。如果它总是返回相同的可观察值,那么您就不需要defer
。如果它返回不同的观察值(例如使用不同的参数发出HTTP请求),那么您需要使用defer()
您只是使用了错误的defer()
。它将回调作为一个参数,每次新的观察者订阅时都会调用该参数。当您将它用作defer(this.manager.getUser())
时,它会尝试使用getUser()
的返回值作为方法,我想它不是,因此会抛出错误
相反,您应该这样使用它:
defer(() => this.manager.getUser())
现在,每个新订阅都将调用此方法,defer()
将订阅它。我不知道你是否应该用它。这取决于getUser()
在内部做什么。如果它总是返回相同的可观察值,那么您就不需要defer
。如果它返回不同的观察值(例如使用不同的参数发出HTTP请求),那么您需要使用defer()
为什么首先要使用defer?你知道它是做什么的吗?我的想法是,defer
只会在观察者订阅时创建可观察对象。。。首先,我从
中获得了,然后我开始考虑延迟
,但部分原因是我“仅”将承诺转换为可观察的,这可能有助于您了解延迟是如何工作的以及应该如何使用。您为什么要首先使用延迟?你知道它是做什么的吗?我的想法是,defer
只会在观察者订阅时创建可观察对象。。。首先,我从
中获得了,然后我开始考虑延迟
,但部分原因是我“仅”将承诺转换为可观察的,这可能有助于您了解延迟如何工作以及应该如何使用。getUser()从存储中获取用户并返回PromisegetUser()从存储中获取用户并返回承诺
defer(() => this.manager.getUser())