解锁 Meteor.logout 并登录

Unblocking Meteor.logout and login

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

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 完成,而是立即工作)。

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

除非我误解你了,你只需要在 调用 Meteor.logout 之后调用 fn 。困难在于,这可能会 运行 而用户仍处于登录状态,这正是他们允许您传递回调的原因。

仅在 logout 完成且用户注销后调用 fn Meteor.logout(fn)

发送注销请求后立即调用 fn(此时用户实际上尚未注销)。 Meteor.logout() fn()

这是 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();
      }
    });
}

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

// 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() 即使在用户注销的同时也是正确的对象。