如何等待函数完成然后在onBeforeAction中调用this.next()?

时间:2015-04-09 12:59:04

标签: javascript meteor iron-router

在我的onBeforeAction方法中,我需要等待函数完成,然后调用this.next()。

Router.onBeforeAction(function () {
    var self = this;

    functionToWait(function () {
        // Success callback
        self.next(); 
    });
});

但似乎onBeforeAction在函数之前完成,因此当我调用self.next()时会抛出异常。


我在这里问过类似的问题,但我的问题没有解决。

How to make onBeforeAction call wait until a function call inside finishes in meteor.js?

需要进行的是网站需要身份验证。为此目的,会话中存储了一个令牌。我想要实现的是,只要路由发生变化,就需要验证令牌。我正在尝试在onBeforeAction中进行此验证。来自iron-router的新API说我需要在这个方法中调用this.next()。但问题是onBeforeAction方法完成运行 BEFORE 验证。因此,在验证的成功回调中,调用self.next()将抛出异常。

我尝试过:

  1. 写一个处理程序来告诉onBeforeAction等到验证完成然后继续,但我之前的问题的答案给了我一个无限循环,我不知道如何解决它。

  2. 创建会话变量tokenValidated,在clientStart上运行验证。并在成功回调中将其设置为true。并在onBeforeAction中检查此变量。

  3. 此解决方案的问题在于,当您尝试刷新页面时它不会起作用,原因与在验证之前完成onBeforeAction相同。

    1. 直接在验证成功回调中调用onBeforeAction。
    2. 这在登录后有效,但首次访问时不受保护。

      1. 直接等待会话变量tokenValidated

        this.wait(Meteor.subscribe('令牌',Session.get(' tokenValidated')));

      2. 并检查它是否已准备好

        if (this.ready()) // proceed
        

        它似乎也无法发挥作用。

        此命令存储身份验证令牌:

        Session.setPersistent('authToken');
        

        因此它存储在localStorage中。我想要实现的行为是:

        1. 每当新会话开始时,请验证此authToken,并将其设置为True / Fasle。

        2. 在onBeforeAction中检查此状态并继续进行。

        3. 此状态需要准备好之前 onBeforeAction。

        4. 我的问题是验证调用服务器方法并花费时间返回状态,我找不到告诉onBeforeAction等待验证的方法。

1 个答案:

答案 0 :(得分:0)

以下是我解决这个问题的方法。

我没有在onBeforeAction中验证身份验证令牌,而是在client.js中执行此操作:

Meteor.startup(function () {
    // Validate authentication token here
    Meteor.call('validateAuthToken', Session.get("authToken"), function (error, result) {
        if (!result) {
            Router.go('/login');
        } else if (!Router.current().route.getName()) {
            // Site init from root, token is validated, direct to notepage
            Router.go('/notepad');
        }
    });
});