Angular 不使用subscribe如何从observable获取值
当我开始学习angular时,我在博客上读到,使用异步管道更好,因为它可以自动取消订阅数据流。我也是 HTMLAngular 不使用subscribe如何从observable获取值,angular,rxjs,Angular,Rxjs,当我开始学习angular时,我在博客上读到,使用异步管道更好,因为它可以自动取消订阅数据流。我也是 HTML <div *ngIf="users | async"> <ul> <li *ngFor="let user of users | async">{{ user.name }}</li> </ul> </div> 因此,在ngOnInit方法中
<div *ngIf="users | async">
<ul>
<li *ngFor="let user of users | async">{{ user.name }}</li>
</ul>
</div>
因此,在ngOnInit方法中,控制台日志
console.log(this.users);
给我
Observable {_isScalar: false, source: Observable, operator: MapOperator
我通过异步管道获得了HTML中的值,但是如果我需要根据从后端获得的用户在componenet-ts文件中执行一些逻辑,该怎么办呢
如果我想要里面的数据,我可以用subscribe来做。但我不想这样,因为首先我开始使用异步管道,因为我不想手动取消订阅
因此,在这种情况下,如果没有订阅,我如何从可观察到的数据中获得值呢
组件已被禁用,我不关心取消订阅。如果您想在可观察组件内执行一些转换,只需使用
映射
管道可观察操作符:
onlyActiveUsers: Observable<any>;
ngOnInit() {
this.onlyActiveUsers$ = this.http
.get('https://jsonplaceholder.typicode.com/userss')
.pipe(
map(users => {
const transformedUsers = users.filter(user => user.isActive);
return transformedUsers;
})
)
}
我知道这并不能回答你最初的问题,即如何获得
没有订阅价值,但我张贴,因为你可能不知道
此方法模拟来自订阅的异步行为
管道
根据maxime下面的评论,您也可以实现
takeUntil
操作符作为解决方案
- 关于差异,请参考下面他的解释
ngUnsubscribe: Subject<void> = new Subject<void>(); this.http.get('https://jsonplaceholder.typicode.com/userss') .pipe(takeUntil(this.ngUnsubscribe)) .subscribe(val => this.users = val) ngOnDestroy() { this.ngUnsubscribe.next(); }
使用异步管道的方法是完全正确的。但是它将为你做的是订阅可观察的,因为你得到了数据。它还将处理取消订阅,因为使用异步管道非常方便 这就是可观察事物的本质:只有当你订阅它时,你才能得到值
如果您想在组件中拥有这些值,则需要订阅。此处我不想转换为Promise如果您不想将此.user转换为Promise,您可以创建另一个变量并将用户数据存储在其中。如果转换为promise If,则只需要完成此操作,那么好吧……您实际希望如何处理组件中的
?如果从模板调用组件中的函数,则可以将用户
从模板传递到该函数,并以这种方式访问函数中的用户。这与异步管道不同。异步管道使流保持打开状态,直到其主机被销毁。无论是因为该级别存在ngIf,还是主机组件正在被销毁(例如,ngIf更高级别或新路由)。因此,如果您正在进行一个HTTP调用,该调用需要10秒才能解析,并且您移动到另一个组件,那么即使该组件正在被销毁,take(1)选项仍将在后台运行,但异步管道的情况并非如此。如果你想要一个等价物,你可以挂在Ngondestory上,在一个主题中释放void,然后做一个takeUntil@maxime1992这是真的,我已经将您的方法作为一个可行的实现包括在内,并且使用用户
方法围绕take
HTTP.get
onlyActiveUsers: Observable<any[]>; allUsers: any[]; ngOnInit() { this.onlyActiveUsers$ = this.http .get('https://jsonplaceholder.typicode.com/userss') .pipe( tap(allUsers => this.allUsers = allUsers), // here, or after "map" below map(users => { const transformedUsers = users.filter(user => user.isActive); return transformedUsers; }) ) }
ngUnsubscribe: Subject<void> = new Subject<void>(); this.http.get('https://jsonplaceholder.typicode.com/userss') .pipe(takeUntil(this.ngUnsubscribe)) .subscribe(val => this.users = val) ngOnDestroy() { this.ngUnsubscribe.next(); }
this.http.get('https://jsonplaceholder.typicode.com/userss') .pipe(take(1)) .subscribe(val => this.users = val)