【问题标题】:Force iron-router to get back an ready from waitOn强制 Iron-router 从 waitOn 取回一个准备好的
【发布时间】:2014-12-21 07:07:02
【问题描述】:

目前似乎无法在路由中强制进入 ready() 状态。例如: 我有 2 个订阅等待。其中一个返回 Meteor.Error - 现在路线将处于加载状态,没有结束。 有没有推荐的方法告诉 Iron-router“等待订阅准备好或订阅失败并出现错误”?

编辑:

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

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

【问题讨论】:

    标签: meteor iron-router


    【解决方案1】:

    一般建议

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

    假设你的路由需要订阅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 并使用动态创建的描述错误原因的文档。这个的实现有点棘手,如果你卡住了,可能值得一个单独的问题。在尝试之前,我会先看看前两个是否有意义。

    【讨论】:

    • 这看起来不错 - 但对我没有帮助。我编辑了我的帖子,向您展示了我遇到的真正问题(我需要在 waitOn 参数或服务器端同步方法之前使用异步函数,但如果出现错误,我需要返回。)
    • 好的,我用更多建议更新了答案 - 希望其中一个对你有用。
    • 不错的输入 - 再次。我今天会检查一下,会给你一个反馈。
    • 嗨,大卫,很抱歉回复晚了,但无法测试您的 3 分。第 1 点:我可以向路由添加一个函数(如 onBeforeAction),但这不能像我理解的那样是异步的?而且-据我所知-没有办法调用在服务器端执行的方法并告诉路由器等到结果出现,不是吗?第 2 点:这就是我现在更新并执行的操作 - 所以订阅已“准备好”,但我不知道为什么:是否有错误?所以这并不能解决问题,但必须这样做! (谢谢)。
    • 第 3 点:我阅读了文档,这似乎是一个选项......如果有可能的话,像添加一个“添加”或“更改”回调到订阅的内容.然后我可以告诉订阅者添加了一些内容(例如错误代码),并且我可以在客户端读取这些内容 - 但这仍然可以通过这种方式实现吗?没有“订阅”回调 - 相反,似乎只是有一个 Collection 回调,对吧?我认为这不是最好的解决方案,但也许是唯一可行的解​​决方案......
    猜你喜欢
    • 1970-01-01
    • 2014-11-29
    • 2015-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-27
    • 1970-01-01
    相关资源
    最近更新 更多