代码之家  ›  专栏  ›  技术社区  ›  xeonarno

JS Promise waitFor refresh令牌

  •  1
  • xeonarno  · 技术社区  · 7 年前

    我有一个nodejs服务器(称为API-a),它使用Bluebird作为承诺处理程序。 我有一个客户端(浏览器),通过API-a请求数据,该API-a从另一个API(API-B)获取数据。API-B可以是示例中的天气服务,然后API-a将数据与其他数据聚合并发送回客户端。

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

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

    一切都很顺利,充满希望。 RequestAuthorization()检查令牌是否有效(下一步!!!)如果没有(我请求API-B刷新令牌) 问题在于:

    我怎样才能避免呢?我尽量避免使用cron方法来做这件事,避免不必要的调用,问题也是一样的。

    承诺。因为我在不同的活动范围内,所以不能全部使用。

    请帮忙!

    1 回复  |  直到 7 年前
        1
  •  4
  •   AbhinavD    7 年前

    如果我理解这一点,我们需要做两件事:

    • 在进行刷新令牌时,不要多次调用我们的刷新令牌

    如果您将可观察的模式和状态结合起来以保持进行中的状态,则可以如下所示

    // 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);
    }
    

    fetchToeken 即使我们的方法 A

    希望这有帮助!