Meteor 强制铁路由器从waitOn处取回准备就绪的

Meteor 强制铁路由器从waitOn处取回准备就绪的,meteor,iron-router,Meteor,Iron Router,目前似乎不可能在路由中强制设置ready()状态。例如: 我有两个预订的服务员。其中一个返回Meteor.Error-现在路由将处于加载状态,没有结束。 有没有一种推荐的方法可以告诉iron路由器“等待,直到subscribtion准备就绪,或者subscribtion失败并出现错误” 编辑: 为了解释我的特殊情况: waitOn是用于搜索的路由。搜索参数是“what”和“where”。在“where”中,我有一个平面字符串地址,需要将其转换为地理坐标。为此,我在服务器端使用googlemaps

目前似乎不可能在路由中强制设置ready()状态。例如: 我有两个预订的服务员。其中一个返回Meteor.Error-现在路由将处于加载状态,没有结束。 有没有一种推荐的方法可以告诉iron路由器“等待,直到subscribtion准备就绪,或者subscribtion失败并出现错误”

编辑:

为了解释我的特殊情况: waitOn是用于搜索的路由。搜索参数是“what”和“where”。在“where”中,我有一个平面字符串地址,需要将其转换为地理坐标。为此,我在服务器端使用googlemaps转换器(因为它是同步的)。当没有找到地址时,我需要返回一个错误“这个地址一定是错的”。为此,我需要返回错误的功能

当我像David Weldon说的那样做时,我需要在waitOn方法中执行这一步骤,但是客户端googlemaps转换器不是同步的,而是异步的,所以这不起作用

一般性建议 您的发布者抛出错误是可以的,但是只有当客户端做了错误的事情时,这些条件才应该受到影响。换句话说,您解决了一个错误的问题—您应该只在知道发布者不会抛出错误时订阅。让我们看一个例子:

假设您的路线需要订阅
newPosts
postsForSuperuser
。假设如果用户不是超级用户,则发布者将抛出错误。现在客户的工作就是不让这种情况发生。
waiton
定义可以如下所示:

waitOn:function(){ var subs=[Meteor.subscribe('newPosts'); if(Roles.userIsInRole(Meteor.user(),['superuser'])) subs.push(Meteor.subscribe('postsForSuperuser'); 返回潜艇; } 因为我们有条件地添加超级用户的
postsForSuperuser
订阅,所以我们不会给发布者抛出错误的机会

您的特定用例 您的案例有点棘手,因为客户机在做正确的事情,但用户输入可能恰好是错误的。在这种情况下,我认为抛出错误是不合适的。以下是一些建议:

  • 通过在更改路由之前通过方法调用检查地址来避免问题

  • 如果发现地址无效,请让发布功能立即返回此.ready()。这将防止您的路由失败,但您将假定您没有数据的原因是因为地址。如果这是一个有效的假设(即,这是失败的唯一可能原因),那么您的路由器可以使用
    dataNotFound
    hook来处理这个问题

  • 如果需要明确确定错误的原因,请仔细查看中的“计数”示例。您可以声明名为
    addressErrors
    的纯客户端集合,然后调用
    this。添加了一个动态创建的文档,描述了错误的原因。这一点的实现有点棘手,如果您陷入困境,可能值得提出一个单独的问题。在尝试之前,我会先看看前两个是否有意义


  • 这看起来不错,但帮不了我。我编辑了我的帖子,向你展示了我真正的问题(我需要在waitOn参数之前使用一个异步函数或服务器端同步方法,但如果有错误,我需要返回。)好的,我更新了答案,并提出了一些建议-希望其中一个对你有用。输入很好-再次。我今天会检查这一点,并会给你一个反馈。你好,大卫,很抱歉反应太晚,但我无法测试你的3分。第1点:我可以在路由中添加一个函数(比如onBeforeAction),但这不能像我所说的那样是异步的?而且,正如我所知,没有办法调用在服务器端执行的方法并告诉路由器等待结果,不是吗?第二点:这是我现在更新和做的-所以子循环“准备好了”,但我不知道为什么:是否有错误?因此,这不会很好地解决问题,但必须这样做!第三点:我阅读了文档,这似乎是一种选择。。。如果有可能的话,我想在subscribtion中添加一个“added”或“changed”回调,其中包含它的内容。然后我可以告诉Subscribobt添加了一些内容(例如错误代码),并且我可以在客户端读取这些内容,但这样做是否仍然可行?没有“subscribtion”回调-相反,它似乎有一个集合回调,对吗?我认为这不是最好的解决方案,但可能是唯一可行的解决方案。。。