问题描述
有一个问题,我认为必须以某种优雅的方式解决,但需要一些输入。我正在使用香草Javascript来解决此问题,但想知道是否可能有更优雅的React解决方案或其他一些库。
问题:拥有一个需要仅持续15分钟的承载令牌的API。每次发出数据请求时,我们都需要检查令牌是否有效,如果无效,则请求新令牌。问题是请求和接收新令牌之间存在时间。同时,可能会提出更多的数据请求,从而导致另一个不必要的新令牌请求。
const api = new testApi();
api.getSomeData(1);
api.getSomeData(2);
api.getSomeData(3);
这显然是要演示的超级简化测试。
第一次调用getSomeData。因为没有初始令牌,所以它请求一个新令牌,然后返回其数据。但是,由于Javascript的异步特性,第二个对getSomeData的调用在第一个getSomeData接收到新令牌之前触发。因此,随后两次对getSomeData的调用也请求了一个新令牌。
这是我创建的完整课程,我认为它可以解决问题(但仍想知道这是否是最佳解决方案):
class testApi {
constructor() {
this.token = "";
}
// Return a promise with the resulting token
getToken() {
this.token = new Promise((resolve,respond) => {
setTimeout(() => {
console.log("Got a new token!");
resolve(Math.random() * 1000);
},1000);
});
}
// Simple check to determine if token is valid
isValidToken() {
if (this.token === "") return false;
return true;
}
// Call to api to get some data
getSomeData(callNum) {
if (!this.isValidToken()) {
console.log("Token not valid so we need to get another");
this.getToken();
}
// Token is always a promise so we use .then to make sure it's current
this.token.then((result) =>
console.log(`Token for call ${callNum} is ${result}`)
);
}
}
const api = new testApi();
api.getSomeData(1);
api.getSomeData(2);
api.getSomeData(3);
通过将此this.token设置为对新令牌的请求所返回的promise(在此由setTimout模拟),对该令牌的任何请求都必须使用.then来获取有效令牌。
在getSomeData中,有效令牌仅出现在this.token.then()的回调中。如果我们尝试在。之外访问此令牌,则它将返回未兑现的承诺。
此代码的结果是:
Token not valid so we need to get another
Got a new token!
Token for call 1 is 897.2653861706979
Token for call 2 is 897.2653861706979
Token for call 3 is 897.2653861706979
正在为此考虑一种更好的方法吗?
谢谢!
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)