gpt4 book ai didi

javascript - 队列 promise (ES6)

转载 作者:行者123 更新时间:2023-12-04 02:27:03 27 4
gpt4 key购买 nike

我正在编写一个从 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 Promise 的性质,它们在构造时就开始执行,所以 this._Get() onRequest 内部事件返回一个已经在执行的 promise 。有没有一种干净的方法可以避免这种情况,以便我可以正确地将请求排队以备后用?

最佳答案

尝试将请求选项添加到队列中,而不是实际的请求 Promise:

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

关于javascript - 队列 promise (ES6),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50932712/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com