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

排队承诺(ES6)

  •  2
  • w0f  · 技术社区  · 6 年前

    我正在编写一个从API请求数据的nodejs服务。在负载情况下,我不想用可能有数百个同时请求的方式破坏API,因此我尝试将请求排队,以便逐个执行它们,并在它们之间延迟。

    const request = require( 'request' );
    class WebService {
      constructor() {
        this.RequestQueue = [];
      }
    
      _Get( uri, options, reply ) {
        return new Promise( ( resolve, reject ) => {
          request.get( uri, options, ( err, resp, body ) => {
            if ( err )
              reject( err );
    
            reply( resp );
            resolve( resp );
          } );
        } );
      }
    
      async onRequest( data, reply ) {
        this.RequestQueue.push( this._Get( data.uri, data.opts, reply ) );
      }
    
      async execute() {
        while( this.RequestQueue.length > 0 ) {
          var current = this.RequestQueue.shift();
          await current();
          await Utils.Sleep(5000); //promise that resolves after 5 seconds
        }
      }
    }
    

    由于ES6承诺的性质,它们在构建时就开始执行,因此 this._Get() 内部 onRequest 事件返回已执行的承诺。有没有一种干净的方法可以避免这种情况,以便我可以将请求正确地排队等待稍后处理?

    1 回复  |  直到 6 年前
        1
  •  5
  •   maxpaj    6 年前

    尝试将有关请求的信息添加到队列,而不是实际承诺:

    onRequest(data, reply) {
        this.RequestQueue.push({ 
            uri: data.uri, 
            opts: data.opts, 
            reply: reply 
        });
    }
    
    async execute() {
        while(this.RequestQueue.length > 0) {
            var current = this.RequestQueue.shift();
            await this._Get(current.uri, current.opts, current.reply);
        }
    }