javascript - 取消订阅 Firestore 流 - Angular

标签 javascript angular firebase google-cloud-firestore rxjs

最近,我在 Angular 项目中实现了 Firebase,并且有一个关于取消订阅数据流的问题。

当您使用经典的 HTTP 调用时,从中可观察到的数据是有限的,但使用 firestore 时,这些可观察到的数据是无限的,因此您必须取消订阅。但是当我这样做时(销毁组件并注销后),我仍然在控制台中收到错误,并且我可以看到请求仍在发送(或持续)。

在网络选项卡中,我可以在请求计时中看到这一点:

Caution: request is not finished yet

注销后弹出此错误(可能是由于我设置的规则引起的)

FirebaseError: Missing or insufficient permissions

而且,即使我在 Angular 中使用 async 管道,我仍然会收到错误。

这是我当前的解决方案:

data.service.ts

  items: Observable<any[]>;

  constructor(db: AngularFirestore) {
    this.items = db.collection("data").valueChanges();
  }

  getItems() {
    return this.items;
  }

home.component.ts

  req: Subscription;

  ngOnInit(): void {
    this.req = this.dataService.getItems().subscribe(
      res => {
        console.log(res);
      },
      err => console.log(err),
      () => console.log("completed")
    );
  }

  ngOnDestroy(): void {
    console.log("ya");
    this.req.unsubscribe();
  }

感谢您的建议!

最佳答案

home.component.ts

import { takeWhile } from "rxjs/operators";

@Component({...})
export class HomeComponent implements OnInit, OnDestroy {
  isAlive: boolean = true;

  ...

  ngOnInit(): void {
    this.dataService.getItems()
      .pipe(takeWhile(() => this.isAlive))
      .subscribe(res => {
        console.log(res);
      });
  }

  ngOnDestroy(): void {
    this.isAlive = false;
  }

}

takeWhile 是你所需要的

关于javascript - 取消订阅 Firestore 流 - Angular,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59334333/

相关文章:

javascript - 在 Javascript 中使用用户输入作为变量?

javascript - 如何在 for 循环中使用 setInterval()

javascript - Kendo UI Editor - 更改字体颜色选择器和背景颜色选择器的默认颜色

Angular2 - 测试调用内部http服务的函数

javascript - Angular4中三种类型的数据绑定(bind)指令 : [val] , [(val)] , (val) 有什么区别

node.js - 如何在WebStorm中调试firebase云功能?

javascript - 从 Promise 捕获 Firebase 身份验证错误

swift - 数据库不可用使用对象构造 FIRDatabase swift

javascript - 如何根据所选数据自动填充其他自动完成值,并添加数据(如果尚不存在)?

javascript - ng2-charts:如何在 typescript 中动态设置图表标题