【问题标题】:rxjs subscription returning duplicatesrxjs 订阅返回重复项
【发布时间】:2019-08-20 10:57:36
【问题描述】:

从 Angular 服务订阅后,返回的结果是一堆重复的。每调用一次,重复次数就会增加一次。

我尝试在应用程序的各个阶段通过控制台记录结果。在 promise 被渲染后立即返回重复项

Angular 服务代码:

GetUserPendingApprovals(userid: string) {
    let approvalsPending: any[] = [];
    this.http
      .get<{message, approvals: any}>(`/api/approvals/${userid}`)
        .subscribe(approvals => {
          console.log(approvals.approvals);
          approvalsPending = approvals.approvals;
          this.approvalsUpdated.next(approvalsPending);
          approvalsPending = [];
      });
  }
getUserPendingApprovalsUpdateListener() {
  return this.approvalsUpdated.asObservable();
}

节点端点:

app.get("/api/approvals/:userid", (req, res, next) => {
  // const urlData = req.params.userId;
  //console.log(urlData);
  const query = datastore
  .createQuery('approvals')
  .filter('src', '=', req.params.userid);

  query.run().then(approvals => {
  approvals.forEach(approval => console.log(approval));
  console.log(approvals[0].length);
  res.status(200).json(
    {
      message: "Request was processed successfully!",
      approvals: approvals[0]
    }
  );
})
})

节点端点上的控制台日志记录为正在查询的结果返回正确的计数值。但是,在 Angular 服务代码上对相同结果的控制台日志记录会返回重复项,并且每次调用重复项的数量都会增加一个。示例:第 1 次调用 - 2 个重复,第 2 次调用 - 3 个重复,第 3 次调用 - 3 个重复,依此类推。

更多信息... 我正在从我的角度组件进行嵌套订阅。像下面这样 -

ngOnInit() {
    this.activatedRoute.params
      .subscribe(
        (params: Params) => {
         ....some code goes here...
         this.revenueService.GetUserInvoicesThisWeek(this.userid);
         this.currentWeekInvoicesSub = this.revenueService.GetUserInvoicesThisWeekListener()
            .subscribe((revenueInfo: Revenue[]) => {
            ....some code goes here...
            });
         this.currentDayInvoicesSub = this.revenueService.GetUserInvoicesTodayListener()
            .subscribe((todayRevenueInfo: Revenue[]) => {
            ....some code goes here...
            });
         this.approvalsService.GetUserPendingApprovals(this.userid);
         this.approvalsSub = this.approvalsService.getUserApprovalsUpdateListener()
            .subscribe((approvalsPending: any[]) => {
            ....some code goes here...
            });
         });
}

最后一次订阅是我遇到问题的地方。但是我很确定在节点端点调用返回重复之后立即呈现的承诺。我在这个问题的开头提到的东西。

疑问: 这些重复的根本原因是什么? 如何解决这个问题?

【问题讨论】:

  • 数组中是否重复:this.approvalsUpdated?
  • @Aragorn this.approvalsUpdated 是 rxjs 主题的对象。 private approvalsUpdated = new Subject&lt;any&gt;(); 但我相信重复项实际上是在加载 this.approvalsUpdated 之前出现的。当这一行 - console.log(approvals.approvals); 被执行时,我可以看到重复项

标签: node.js angular typescript rxjs google-cloud-datastore


【解决方案1】:

每次调用此函数时您都在订阅,因此每次更改路线时您都在进行重复订阅。

GetUserPendingApprovals(userid: string) {
            let approvalsPending: any[] = [];
            this.http
              .get<{message, approvals: any}>(`/api/approvals/${userid}`)
                .subscribe(approvals => {
                  console.log(approvals.approvals);
                  approvalsPending = approvals.approvals;
                  this.approvalsUpdated.next(approvalsPending);
                  approvalsPending = [];
              });
          }

订阅组件而不是服务以解决此问题。

GetUserPendingApprovals(userid: string) {

    return this.http
          .get<{message, approvals: any}>(`/api/approvals/${userid}`)

      }

组件 ts:

 ngOnInit(){
   this.aprovalSub = this.approvalsService.GetUserPendingApprovals(this.userid);
    .subscribe(approvals => {
                      approvalsService.approvalsPending = approvals.approvals;
                      approvalsService.approvalsUpdated.next(approvalsPending);
                       });
}

ngOnDestroy(){
  if(this.aprovalSub !== undefined) this.aprovalSub.unsubscribe()
}

在组件被销毁时清理订阅,否则它们将留在内存中,您将有订阅占用内存。

【讨论】:

  • 你是说,我需要从组件内部进行 api 调用?
  • @user464159 我编辑了我的答案,因此它更详细地显示了如何解决该问题
  • 谢谢。这对我有用。但是您能否详细说明我犯了什么错误以及将来如何处理?另外,如果您觉得这篇文章对其他人有用,请为我的问题投票。
  • 因此,当您编写具有 http 调用的函数并在该函数中订阅该调用时。每当您调用该函数时,您都会在订阅池中添加一个新订阅,这就是您获得重复订阅的原因。有多种方法可以处理它。对我来说,最佳实践是订阅您需要该数据的组件,如果可能的话,使用异步管道(它为您处理订阅和取消订阅)。其他解决方案是使用 rxjs 和 take(1) 运算符,或者如果您不期望流,但单个数据块可能与 toPromise 和 async/await 一起使用
猜你喜欢
  • 2021-10-17
  • 1970-01-01
  • 2016-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多