更好的解决方案? -使用多个使用该令牌的异步Javascript调用来刷新API承载令牌

问题描述

一个问题,我认为必须以某种优雅的方式解决,但需要一些输入。我正在使用香草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 (将#修改为@)