【问题标题】:Update in Firestore is causing infinite loopFirestore 中的更新导致无限循环
【发布时间】:2017-11-03 13:47:17
【问题描述】:

我目前正在尝试使用 Angular 4 在 Firestore 中设置一个计数器,该计数器会在用户单击特定按钮时更新。单击按钮会更新计数器,但会启动无限循环。阻止它的唯一方法是注释掉没有帮助的行,因为每次我决定单击该按钮时都需要更新计数器。这是代码。

addFoodToCart(uid: string, email: string, item: Goods)
  {
    this.getUserInDB(email).doc(uid).valueChanges().subscribe(a =>
    {
      this.getUserInDB(email).doc(uid).collection('cart').add(item);
      this.getUserInDB(email).doc(uid).update({'food': ++a['food'], 'technology': 0, 'email': email});
    });
  }

如您所见,我也在向同一个数据库添加一个项目,但我也注释掉了该部分,它仍然会导致数据库中的无限循环。发生这种情况的任何原因以及如何解决?我还使用 Google Chrome 作为我的网络浏览器进行开发。不知道有没有影响

【问题讨论】:

    标签: angular google-cloud-firestore


    【解决方案1】:

    我很难对此进行测试,但您可以在单个返回值后添加 take() 运算符来取消订阅:

    addFoodToCart(uid: string, email: string, item: Goods)
    {
        this.getUserInDB(email).doc(uid).valueChanges().take(1).subscribe(a =>
        {
            this.getUserInDB(email).doc(uid).collection('cart').add(item);
            this.getUserInDB(email).doc(uid).update({'food': ++a['food'], 'technology': 0, 'email': email});
        });
    }
    

    假设您对该文档的订阅时间较长,并且已连接到其他地方,那么更新应该会自动反映。

    请注意,根据您的应用的用途,您可能需要等待这些调用(或以其他方式处理承诺

    【讨论】:

    • 您是否将 take 运算符放在订阅之后。我试过这样做,它是说订阅类型上不存在 take()
    • 是的,您需要在文件顶部导入运算符。查看 angular 或 rxjs 文档以查看语法(对不起,在我的手机上,我会尝试为您提供)。
    • 我已经尝试按照您建议的方式进行操作,但它仍然解决了这个问题。我注意到的是,当我更改 firestore 中的值时,它似乎会执行,所以它的执行可能是基于 firestore 数据库中值的更改。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-23
    • 2020-08-27
    • 2021-05-07
    相关资源
    最近更新 更多