我目前正在对API进行一些更改,这里的问题是我们从另一台服务器请求数据,但是服务器要处理我们的请求,为了安全起见,我们首先要求他们提供AccessToken,如果令牌有效且还活着(那些令牌持续2秒钟,我不知道怎么用英语正确地说,对不起)然后一切都很好,如果令牌不好我们就不能问他们什么。
这里的情况是,现在API发出请求而不首先要求令牌,如果当前令牌(因为当API启动它要求令牌时)无效,那么它会捕获错误并要求一个新的令牌,然后再次发出请求。
我不喜欢它。如果我每两秒要一个新令牌而不是发现错误,我觉得会更简单,更清楚。
我怎样才能以优雅高效的方式实现这一目标?我现在能想到的最基本的形式是通过计时器每两秒对一个自执行函数作出一个承诺。但我不认为这是最好的方法。有什么建议吗?
答案 0 :(得分:-1)
我的两分钱:您可以跟踪当前令牌的检索时间,比如说,从UTC开始的毫秒或系统启动时的纳秒,这样您就可以在发送之前根据其到期时间检查它是否仍然有效请求。如果它已经过期,您只需在发送请求之前拉一个新的,从而保存请求/响应。有关令牌的信息(如此令牌在到期之前的时间)可以与令牌本身一起传送,具体取决于传输协议或数据格式。它可以在一个线程(或它们中的一组)中处理,只有在需要时才能获得新的令牌,为客户端和服务器节省带宽。
希望这会对你有所帮助。
答案 1 :(得分:-1)
投票真的没有什么特别优雅的。也不是为了争取他们的系统,不断地要求代币。
更优雅的解决方案是结合一些功能多态,递归和/或链接。
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);
你现在已经采用了所有疯狂的,不优雅的代码,将其转换为简单的函数和高阶函数,应该清楚地理解,并清楚地映射控制流。