取消阻止Meteor.logout并登录

Nuv*_*nnu 2 javascript timeout fiber meteor

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

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;
  }
});
Run Code Online (Sandbox Code Playgroud)

从客户端(使用浏览器控制台)调用这些方法时,它们工作正常(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
});
Run Code Online (Sandbox Code Playgroud)

但是,当有一个会话并且我们调用时Meteor.logout(fn),callback(fn)将在foo完成之后等待.

我不希望这样.我希望这个logout方法能够像bar(不等待完成foo,但立即工作)一样工作.

我怎样才能做到这一点?有没有办法解锁 logout或类似的东西?登录操作以相同的方式(当前)工作:它等待直到foo发送响应.

Ion*_*zău 5

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

您正在使用的假设accounts包(它创建了Accounts全局变量),你可以看看这里的源代码logout定义的方法:

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

如果您确实希望注销立即生效,可以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();
      }
    });
};
Run Code Online (Sandbox Code Playgroud)

(注意wait:false上面的代码)

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