如何避免在我的流星路由器中出现无限循环?

How can I avoid an infinite loop in my meteor router?

我正在 meteor 中建立一个在线商店,客户可以在其中定制商店中的产品。我已经设置了一个名为 Inventory 的仅限客户端的集合,它存储所有产品数据并根据用户输入进行相应更新。一旦用户准备结帐,我将产品数据转储到名为 ShoppingCart 的客户端和服务器端集合中。我想让用户返回并修改他们在 Inventory 中对产品的编辑,所以我将我的路由器设置为 $setShoppingCartInventory 的数据,如果它找到比赛:

Router.route '/:_type/:_id', ->
  Session.set "inCart", false
  @render @params._type, 
    data: =>
      storedItem = ShoppingCart.findOne {
        userId: Meteor.userId(), 
        image: @params._id
      }
      if storedItem?
        delete storedItem._id
        Inventory.update {image: @params._id}, {
          $set: storedItem
        }
      Inventory.findOne image: @params._id

编辑:这似乎导致我的路由器方法在 Inventory 中的数据发生变化时陷入无限循环。有什么办法可以避免这个问题吗?有没有更好的方法来处理我应该考虑的这类数据?

主要注意事项 - 我不使用 CoffeeScript,所以这是我将您的代码通过编译器后可以收集到的信息。

我认为问题在于数据函数是反应性的,并且您正在更新 从其中的 Inventory 集合返回一个项目。每次路由运行时,除非没有 storedItem,否则它将使它本身所依赖的计算无效,从而立即重新运行(并随后再次执行相同的操作,等等)。

作为一般规则,我认为从数据函数中更新集合确实是一个非常糟糕的主意 - 如果您必须在路由函数中执行此操作,请考虑 onRun,或 onBeforeAction 更新挂钩。

最后一件事,只是因为我不明白:为什么你需要将购物车中的商品转储回库存中?除非用户开始新会话,否则它不应该已经存在了吗?