javascript - 许多异步函数应该等待第一个函数完成

标签 javascript asynchronous callback wait

考虑以下关于异步函数的设置:

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功能(正在验证时)

我无法理解这个问题。我试图让这个例子尽可能简单

最佳答案

我认为您的解决方案是 caching 。创建一个保存值 isUserAuthenitatedisAuthenitcationProcess 的缓存,当您需要调用 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
        }
    }
};

如果你可以使用Async.jsthis回答

关于javascript - 许多异步函数应该等待第一个函数完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28068595/

相关文章:

javascript - 将javascript中的完整日期字符串转换为yyyymmdd

ajax - 我应该如何在 Redux 中获取关系/嵌套数据?

java - SimpleAsyncTaskExecutor 仅启动 8 个线程

c# - Task.Delay 是如何工作的?

android - 单击监听器中的异步任务将引用传递给接口(interface)

JavaScript:突破回调函数

ruby-on-rails - Rails seeds.rb : How can I skip multiple callbacks using Class. skip_callback?

javascript - ChartJS 出现又消失

javascript - 具有多个 Controller 的 Angular 共享模型

javascript - Javascript播放声音结果为 “Error calling method on NPObject”