取消阻止Meteor.logout并登录

时间:2016-01-20 05:57:14

标签: javascript meteor timeout fiber

我在服务器端有两个方法,如下所示:

var Future = require("fibers/future");

Meteor.methods({
  foo: function () {
     this.unblock();
     var f = new Future();
     setTimeout(function () {
         f.return(42);
     }, 10000);
     return f.wait();
  },
  bar: function () {
     return 43;
  }
});

从客户端(使用浏览器控制台)调用这些方法时,它们工作正常(foo等待10秒,bar立即工作):

Meteor.call("foo", function (err, data) {
   console.log(err || data);
   // After 10 seconds: 42
});

Meteor.call("bar", function (err, data) {
   console.log(err || data);
   // Very quick (*instantly*): 43
});

但是,在进行会话并致电Meteor.logout(fn)时,回调(fn)会在foo完成后等待。

我不想要那个。我希望logout方法像bar一样工作(不等待foo完成,但立即工作)。

我该怎么做?有没有办法取消阻止 logout或类似的东西?登录操作以相同的方式(当前)工作:它等待foo发送响应。

2 个答案:

答案 0 :(得分:5)

这是logout方法的预期行为。 等待直到服务器上的所有内容都完成,然后注销用户。

假设您正在使用accounts包(创建Accounts全局变量),您可以查看the logout method is defined所在的源代码:

logout(callback) {
    var self = this;
    self.connection.apply('logout', [], {
      wait: true
    }, function (error, result) {
      if (error) {
        callback && callback(error);
      } else {
        self.makeClientLoggedOut();
        callback && callback();
      }
    });
}

如果您真的希望注销立即,您可以通过关闭Accounts.logout选项来覆盖wait功能:

// Override the method and turn off the `wait` field
Accounts.logout = function () {
    var self = this;
    self.connection.apply('logout', [], {
      wait: false
    }, function (error, result) {
      if (error) {
        callback && callback(error);
      } else {
        self.makeClientLoggedOut();
        callback && callback();
      }
    });
};

(请注意上面代码中的wait:false

这可能会导致事情崩溃(特别是在客户端),因为注销后Meteor.user()将是null,但必须对此进行测试。我希望在服务器上(在服务器方法的上下文中)Meteor.user()即使在用户注销的同时也是正确的对象。

答案 1 :(得分:2)

除非我误解了您,否则您只需在之后拨打fn ,即可致电Meteor.logout。很难在用户仍然登录时运行,这正是他们允许你传递回调的原因。

fn仅在logout完成且用户退出后致电 Meteor.logout(fn) fn

一旦发出退出请求就会调用 Meteor.logout() fn() (此时用户实际上不会被注销)。 <div> <nav>render-here-only-one</nav> <section>render-here-when-page-changes/loads</section> </div>