JS Promise waitFor刷新令牌

情况很简单:

我有一个nodejs服务器(称为API-A)使用蓝鸟作为承诺处理程序。 我有一个客户端(浏览器),通过从另一个API(API-B)获取数据的API-A询问数据。 API-B可以是来自示例的气象服务,然后API-A将数据与其他数据聚合并将其发送回客户端。

情况是下一个:API-B需要一个具有1800秒的TTL的令牌。 因此,对于客户端的每个请求,我检查我的令牌是否过期。

我有这样的代码:

function getActivities() { return this.requestAuthorisation() .then(()=>{ // some other code that is not interesting }) } 

一切工作都很好,承诺的荣耀。 requestAuthorisation()检查令牌是否有效(下一个!!!),如果没有(我做一个请求API-B刷新令牌)问题在于:在这个时间之间,令牌已经过期以及获得的时间一个新鲜的,有时会发生。 如果1000个客户端同时询问这些,我将有1000个令牌对API-B的请求,这不是很酷。

我怎样才能避免呢? 我尽量避免使用cron-way,避免不必要的调用,问题是一样的。

我尝试创build一个跟踪令牌刷新状态的全局variables(boolean),但不可能find一种Promise.WaitFor(variables更改)的Promise.all无法使用,因为我处于不同的事件范围。

有没有办法排队,直到令牌刷新?

请帮忙 !

如果我明白这个写法,我们需要做两件事情:

  • 正在进行的时候不要多次调用我们的refreshToken
  • 一旦完成,让所有的等待请求都知道完成令牌的请求,以便他们可以继续工作。

如果结合Observable模式和状态来维持进行中的状态,可以像下面那样完成

 // MyObservable.js: var util = require('util'); var EventEmitter = require('events').EventEmitter; let inProgress = false; function MyObservable() { EventEmitter.call(this); } // This is the function responsible for getting a refresh token MyObservable.prototype.getToken = function(token) { console.log('Inside getToken'); if (!inProgress) { console.log('calling fetchToken'); resultPromise = this.fetchToken(); inProgress = true; resultPromise.then((result) => { console.log('Resolved fetch token'); inProgress = false; this.emit('done', 'token refreshed'); }); } } // This is a mock function to simulate the promise based API. MyObservable.prototype.fetchToken = function(token) { console.log('Inside fetchToken'); return new Promise((resolve, reject) => { setTimeout(() => { console.log('resolving'); resolve("Completed"); }, 2000); }); } util.inherits(MyObservable, EventEmitter); module.exports = MyObservable; 

现在我们可以实现这一点,并观察完成的呼叫

 const MyObservable = require('./MyObservable'); const observable = new MyObservable(); const A = () => { console.log('Inside A'); observable.on('done', (message) => { console.log('Completed A'); }); observable.getToken('test'); } for (let i = 0; i < 5; i++) { setTimeout(A, 1000); } 

如果我们运行这个代码,即使我们的方法A在相同的持续时间内被调用了5次,你也会得到一个只有一次调用fetchToeken的输出。

希望这可以帮助!