Javascript 什么';每隔一段时间提出请求,哪种方式更优雅、更有效?

Javascript 什么';每隔一段时间提出请求,哪种方式更优雅、更有效?,javascript,node.js,Javascript,Node.js,我目前正在对一个API进行一些更改,这里的问题是,我们从另一台服务器请求数据,但为了让服务器处理我们的请求,为了安全起见,我们首先要求他们提供AccessToken,如果该令牌有效且仍然有效(这些令牌持续2秒钟,我不知道如何用英语正确放置,抱歉)那么一切都很好,如果代币不好,我们就不能向他们索要任何东西 这里的情况是,现在API在不首先请求令牌的情况下发出请求,如果当前令牌(因为当API启动时它请求令牌)无效,那么它会捕获错误并请求新令牌,然后再次发出请求 我不喜欢它。我觉得如果我每两秒钟就请求

我目前正在对一个API进行一些更改,这里的问题是,我们从另一台服务器请求数据,但为了让服务器处理我们的请求,为了安全起见,我们首先要求他们提供AccessToken,如果该令牌有效且仍然有效(这些令牌持续2秒钟,我不知道如何用英语正确放置,抱歉)那么一切都很好,如果代币不好,我们就不能向他们索要任何东西

这里的情况是,现在API在不首先请求令牌的情况下发出请求,如果当前令牌(因为当API启动时它请求令牌)无效,那么它会捕获错误并请求新令牌,然后再次发出请求

我不喜欢它。我觉得如果我每两秒钟就请求一个新的令牌,而不是捕获一个错误,那么会更简单、更清晰


我如何才能做到这一点,但在一个优雅和有效的方式?我现在能想到的最基本的形式是每两秒钟在一个带有计时器的自动执行函数中加入一个承诺。但我认为这不是最好的办法。有什么建议吗?

My two Seconds here:您可以跟踪当前令牌的检索时间,比如从UTC开始的毫秒或从系统启动开始的纳秒,这样您就可以在发送请求之前根据其过期时间检查其是否仍然有效。如果它已经过期,您只需在发送请求之前拉取一个新的,从而保存一个请求/响应循环。根据传输协议或数据格式,有关令牌的信息(如令牌到期前的时间)可以与令牌本身一起交付。这一切都可以在一个线程(或单个线程组)中处理,并且您只会在需要时获得新令牌,从而为客户端和服务器节省带宽


希望这对您有所帮助。

投票真的没有什么特别优雅的地方。也不是不断地破坏他们的系统,索要代币

更优雅的解决方案是合并一些函数多态性、递归和/或链接

const handleInvalidToken = (request, token, data) => err => 
  invalidTokenErr(err)
    ? getNewToken().then(token => request(token, data))
    : Promise.reject(err);

const handleSomeRequest = (token, data) =>
  doAThing(token, data)
    .catch(handleInvalidToken(doAThing, token, data));


handleSomeRequest(userData.token, request.body)
  .then(handleSuccess)
  .catch(handleCatastrophicFailure);

现在,您已经将所有疯狂、不雅观的代码转换为简单函数和高阶函数,这些函数应该被清楚地理解,并清晰地映射控制流。

每两秒钟请求一个新令牌不是一个好主意。它会给服务器带来不必要的额外负载,尤其是在大多数令牌都将被闲置的情况下。您应该创建一个变量:
var validToken
并在收到有效令牌后,将其设置为
validToken=true
执行
setTimeout
两秒钟,然后将其设置为
validToken=false
。如果
validToken==false
,则在进行API调用之前请求一个新的令牌。是的,我也想问这个问题,但我不得不出去吃午饭。2秒的过期时间真的有必要吗?比如,可能应该是1到2分钟,只有当你有待发送的请求时,才应该检索新的令牌。过期时间是由制作API的人设置的,这不取决于我。哦,好吧。那就是你无法控制的事情了。不管怎样,现在有两个答案你可以看。只要把你的答案标记为正确的。谢谢大家的帮助!你如何处理所有的转会时间?您仍然需要保留代码以前的所有边缘案例,因为您要处理的是第三方服务器,因此有DNS查找和网络路由。如果你及时发送了请求,但是当他们开始检查你的令牌时,你已经晚了2毫秒怎么办?如果它在Redis缓存中,并且它们自动过期,那么它们就不能添加缓冲区;它刚刚不见了。这里有太多的边缘,不管怎么说,都是因为抢占了一些你无法控制的东西。