【问题标题】:Async pipe and subscribe on the same Observable异步管道和订阅同一个 Observable
【发布时间】:2021-11-04 11:38:01
【问题描述】:

我在模板中使用异步管道来获取符合特定条件的用户列表 (getNonRedirectingList)。用户存储在 Firestore 实例中。

在我的组件模板中,我有以下(简化的)代码:

    <div *ngIf="users$ | async as users" class="uwrapper">
        <div *ngFor="let u of users">{{u.name}}</div>
    </div>

这就像一个魅力:它产生 3 个 &lt;div&gt; 块,与我期望的 3 个用户匹配。

但是在 Typescript 代码中,我还需要订阅 @angular/fire 返回的相同 Observable

ngOnInit(): void {
  this.users$ = this.userSvc.getNonRedirectingList().pipe(share());
  firstValueFrom(this.users$).then(users => {
    for (let i = 0; i < users.length; i++) {
      console.log(i);
    }
  });
}

我希望

0
1
2

作为控制台中的输出,但我什么也没得到。即使在console.log(i) 行设置断点,它也永远不会被命中。

我已经尝试过使用和不使用.pipe(share()),我也尝试过两次调用getNonRedirectingList,希望得到两个不同的Observable,我也尝试过使用subscribe()unsubscribe() firstValueFrom(),但结果是一样的:异步管道工作,我的代码没有。

在 S Overflow 回答后编辑:

也试过了,结果一样

this.users$.pipe(tap(users => {
  for (let i = 0; i < users.length; i++) {
    console.log(i);
  }
}));

有什么线索吗?

【问题讨论】:

    标签: angular rxjs async-pipe


    【解决方案1】:

    使用async 管道,您已经订阅了 Observable,因此不需要其他任何内容,只需附加运算符,如 tap 即可记录值:

    this.users$ = this.userSvc.getNonRedirectingList().pipe(tap(console.log));

    【讨论】:

    • 谢谢,试过了,还是什么都没做:执行流程没有到达console.log。将编辑我的问题以包含此内容。
    • 更新为在同一 Observable 实例上设置管道。 pipe 创建一个新实例
    【解决方案2】:

    CheckThis

    this.todosList = this.appService.getTodos().pipe(tap((x:any) => {
          x.map(i => console.log(i.id))
        }))
    

    【讨论】:

    • 这与第一个答案有什么不同吗?请查看我编辑的问题以澄清,thatnks。
    • 它使用异步加载视图中的数据并登录控制台。这是你的期望,对吧?
    • 你可以检查样品吗?
    猜你喜欢
    • 1970-01-01
    • 2020-11-13
    • 2017-11-30
    • 2016-12-25
    • 1970-01-01
    • 1970-01-01
    • 2019-05-06
    • 2017-02-14
    • 1970-01-01
    相关资源
    最近更新 更多