强制铁路由器从waitOn回来准备好

时间:2014-10-25 17:03:53

标签: meteor iron-router

目前似乎无法强制路由中的ready()状态。例如: 我在2个订阅上有一个waitOn。其中一个返回Meteor.Error - 现在路由将处于加载状态而没有结束。 有没有推荐的方法告诉铁路由器“waitOn,直到订阅准备就绪或订阅失败并出现错误”?

修改

解释我的特例: waitOn用于搜索的路由。搜索参数是“what”和“where”。在“where”我有一个计划字符串地址,需要将其转换为地理坐标。为此,我使用Serverside上的googlemaps转换器(因为它的同步)。当没有找到地址时,我需要找回一个错误,“这个地址一定是错的”。为此,我需要恢复错误的功能。

当我这样做时,大卫韦尔登说我需要在waitOn方法中执行此步骤,但客户端googlemaps转换器不是同步 - 而是异步,所以这不起作用。

1 个答案:

答案 0 :(得分:2)

一般建议

您的发布商可以抛出错误,但如果客户端做错了,那么这些条件应该。换句话说,您正在解决错误的问题 - 只有在您知道发布者不会抛出错误时才应该订阅。让我们看一个例子:

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

waitOn: function() {
  var subs = [Meteor.subscribe('newPosts')];

  if (Roles.userIsInRole(Meteor.user(), ['superuser']))
    subs.push(Meteor.subscribe('postsForSuperuser'));

  return subs;
}

由于我们有条件地添加postsForSuperuser订阅,因此我们不会让发布商有机会抛出错误。

您的具体用例

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

  1. 通过在更改路线之前通过方法调用检查地址来避免此问题。

  2. 如果发现地址无效,请立即使用发布功能return this.ready()。这样可以防止您的路线失败,但您可以假设您没有数据的原因是因为地址。如果这是一个有效的假设(即它是失败的唯一可能原因),那么您的路由器可以使用dataNotFound挂钩处理此问题。

  3. 如果您需要明确指出错误原因,请仔细查看'计数'来自the docs的示例。您可以声明一个名为addressErrors的仅客户端集合,然后使用动态创建的文档调用this.added来描述错误原因。这样做的实现有点棘手,如果你遇到困难,可能值得单独提问。我在尝试之前看看前两个是否有意义。