考虑以下关于异步函数的设置:
Client.prototype.auth = function(callback) {
//authenticate the client
//run callback
};
Client.prototype.get = function() {
this.auth(function(){
//run the rest of this `get` function
}
};
get
函数,此事件仅触发一次get
应启动身份验证,该身份验证对每个后续调用都有效get
调用都不需要重新进行身份验证,因为它仍然有效,因为第一次调用函数get
调用只应在客户端通过身份验证后运行。如果未经过身份验证,则应等待身份验证完成重点是阻止10个get
来电,以拨打10个auth
来电。每当调用第一个auth
函数时,其他9个get
调用应该等待它完成,然后继续使用get
函数的其余部分(在进行身份验证时)
我无法理解这一点。我试图让这个例子尽可能简单
答案 0 :(得分:1)
我认为你的解决方案是caching。创建一个包含值isUserAutheniticated
和isAuthenitcationProcess
的缓存,当您需要调用auth
时,只需检查用户是否经过身份验证,如果没有调用它。在auth
内部订阅回调中,检查身份验证过程是否打开,如果不进行身份验证设置并调用所有已注册的回调。 Globallist不是实施Observable pattern的最干净选项,因此您可以in other way
这是我的想法:
var isAuthenticated = false;
var isAuthenticatioProcess = false;
var authenticationCallbacks = [];
Client.prototype.auth = function(callback) {
authenitcationCallbacks.push(callback);
if (isAuthenticonProcess) {
return;
}
//authenticate
authenitcationCallbacks.forEach(function(call) {
call();
});
authenitcationCallbacks = [];
isAuthenticonProcess = false;
isAuthenticated = true;
};
Client.prototype.get = function() {
if (isAuthenticated) {
this.auth(function(){
//run the rest of this `get` function
}
} else {
function(){
//run the rest of this `get` function
}
}
};