Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 错误:';可观测性不是一个函数';使用';推迟';_Angular_Rxjs_Observable_Angular9 - Fatal编程技术网

Angular 错误:';可观测性不是一个函数';使用';推迟';

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

我创建了Angular 9指令,该指令仅在用户经过身份验证时显示HTMl元素:

<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())