目前似乎无法强制路由中的ready()状态。例如: 我在2个订阅上有一个waitOn。其中一个返回Meteor.Error - 现在路由将处于加载状态而没有结束。 有没有推荐的方法告诉铁路由器“waitOn,直到订阅准备就绪或订阅失败并出现错误”?
修改
解释我的特例: waitOn用于搜索的路由。搜索参数是“what”和“where”。在“where”我有一个计划字符串地址,需要将其转换为地理坐标。为此,我使用Serverside上的googlemaps转换器(因为它的同步)。当没有找到地址时,我需要找回一个错误,“这个地址一定是错的”。为此,我需要恢复错误的功能。
当我这样做时,大卫韦尔登说我需要在waitOn方法中执行此步骤,但客户端googlemaps转换器不是同步 - 而是异步,所以这不起作用。
答案 0 :(得分:2)
您的发布商可以抛出错误,但如果客户端做错了,那么这些条件应该仅。换句话说,您正在解决错误的问题 - 只有在您知道发布者不会抛出错误时才应该订阅。让我们看一个例子:
假设您的路线需要订阅newPosts
和postsForSuperuser
。如果用户不是超级用户,则假设postsForSuperuser
发布者将抛出错误。现在,客户的工作就是不要让这种情况发生。 waiton
定义可能如下所示:
waitOn: function() {
var subs = [Meteor.subscribe('newPosts')];
if (Roles.userIsInRole(Meteor.user(), ['superuser']))
subs.push(Meteor.subscribe('postsForSuperuser'));
return subs;
}
由于我们有条件地添加postsForSuperuser
订阅,因此我们不会让发布商有机会抛出错误。
你的情况有点棘手,因为机械上客户端正在做正确的事情,但用户输入可能恰好是坏事。在这种情况下,我不认为抛出错误是合适的。以下是一些建议:
通过在更改路线之前通过方法调用检查地址来避免此问题。
如果发现地址无效,请立即使用发布功能return this.ready()
。这样可以防止您的路线失败,但您可以假设您没有数据的原因是因为地址。如果这是一个有效的假设(即它是失败的唯一可能原因),那么您的路由器可以使用dataNotFound
挂钩处理此问题。
如果您需要明确指出错误原因,请仔细查看'计数'来自the docs的示例。您可以声明一个名为addressErrors
的仅客户端集合,然后使用动态创建的文档调用this.added
来描述错误原因。这样做的实现有点棘手,如果你遇到困难,可能值得单独提问。我在尝试之前看看前两个是否有意义。