Angular 不使用subscribe如何从observable获取值

Angular 不使用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方法中

当我开始学习angular时,我在博客上读到,使用异步管道更好,因为它可以自动取消订阅数据流。我也是

HTML

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