提出多个获取请求,但限制为10个请求/分钟nodejs

发布于 2025-02-03 03:01:27 字数 1047 浏览 1 评论 0原文

我很快就会解释我的问题。 我正在使用nodejs从URL中检索响应,我必须向该URL提出多个请求。

我只有一个限制:每分钟我不能提出10个以上的请求。 我该如何处理这个问题?

我也试图也遵循堆栈溢出响应:向只能处理20个请求的API请求几分钟请求

但是该方法不起作用,因为它不等待所有承诺及其给出未定义的结果,

实际上我正在使用该代码,但不是等待所有响应,它使我直接不确定,以后所有请求都完成了:

async function rateLimitedRequests(array, chunkSize) {
var delay = 3000 * chunkSize;
var remaining = array.length;
var promises = [];

var addPromises = async function(newPromises) {
    Array.prototype.push.apply(promises, newPromises);
    if (remaining -= newPromises.length == 0) {
        await Promise.all(promises).then((data) => {
            console.log(data);
        });
    }
};

(async function request() {
    addPromises(array.splice(0, chunkSize).map(apiFetch));
    if (array.length) {
        setTimeout(request, delay);
    }
})();

}

I'll explain my problem shortly.
I am using NodeJS to retrieve response from a url and I have to make multiple request to that URL.

I got only one limit: I can't make more than 10 request for each minute.
How can I handle that problem?

I tried to follow that stack overflow response too: Make several requests to an API that can only handle 20 request a minute

but that method its not working because its not awaiting all promise and its giving undefined result

Actually I am using that code but its not awaiting all response, its giving me undefined directly and later all requests are done:

async function rateLimitedRequests(array, chunkSize) {
var delay = 3000 * chunkSize;
var remaining = array.length;
var promises = [];

var addPromises = async function(newPromises) {
    Array.prototype.push.apply(promises, newPromises);
    if (remaining -= newPromises.length == 0) {
        await Promise.all(promises).then((data) => {
            console.log(data);
        });
    }
};

(async function request() {
    addPromises(array.splice(0, chunkSize).map(apiFetch));
    if (array.length) {
        setTimeout(request, delay);
    }
})();

}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

旧梦荧光笔 2025-02-10 03:01:27

您可以通过实现Promise.all方法来做。

例如:

const [响应1,响应2,响应3] =等待Promise.All([[
axios.get(url_here),axios.get(url_here),axios.get(url_here)];

console.log(wendesp1);

console.log(response3);

console.log(response2);

对于场景2,我们在下面的评论部分讨论

function rateLimiter(array = [], chunkSize = 10 ) {

    const delay = 10 * 1000;

    return new Promise((resolve, reject) => {
        let results = [];
        const callback = (iteration = 0) => {
            const process = array.slice(iteration * chunkSize, chunkSize);
            if(!process.length) return resolve(results);

            Promise.all(process).then(responses => {
                results = [ ...results, ...responses ];
                const processLength = array.slice((iteration + 1) * chunkSize, chunkSize).length;
                
                if(!processLength) return resolve(results);
                setTimeout(() => {
                    callback(iteration + 1);
                }, delay)
            })
        }

        callback();

    })
}

let results = await rateLimiter([ axios.get('URL_HERE'), axios.get('URL_HERE') ], 20);

You can do by implementing Promise.all method.

For example:

const [ response1, response2, response3 ] = await Promise.all([
axios.get(URL_HERE), axios.get(URL_HERE), axios.get(URL_HERE) ];

console.log(response1);

console.log(response3);

console.log(response2);

For Scenario 2 which we discuss below in comment section

function rateLimiter(array = [], chunkSize = 10 ) {

    const delay = 10 * 1000;

    return new Promise((resolve, reject) => {
        let results = [];
        const callback = (iteration = 0) => {
            const process = array.slice(iteration * chunkSize, chunkSize);
            if(!process.length) return resolve(results);

            Promise.all(process).then(responses => {
                results = [ ...results, ...responses ];
                const processLength = array.slice((iteration + 1) * chunkSize, chunkSize).length;
                
                if(!processLength) return resolve(results);
                setTimeout(() => {
                    callback(iteration + 1);
                }, delay)
            })
        }

        callback();

    })
}

let results = await rateLimiter([ axios.get('URL_HERE'), axios.get('URL_HERE') ], 20);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文