解锁 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()
即使在用户注销的同时也是正确的对象。
我在服务器端有两种方法,如下所示:
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()
即使在用户注销的同时也是正确的对象。