gpt4 book ai didi

javascript - 如何使我可以在 javascript 中一次执行 10 个 promise ,以防止 api 调用的速率限制?

转载 作者:行者123 更新时间:2023-11-28 04:30:20 25 4
gpt4 key购买 nike

我有 1000 条记录需要访问速率受限的 API 端点。我希望在任何给定时间只有 5 个对 URL 的调用,这样我就不会同时发出 1000 个请求。我怎样才能做到这一点?我有以下内容:

var Promise = require("bluebird");
var geocoder = Promise.promisifyAll(require('geocoder'));
var fs = require('fs');
var async = require('async');
var parse = require('csv-parse/lib/sync');
var inputFile = './myaddresses.txt'
var file = fs.readFileSync(inputFile, "utf8");

var records = parse(file, {columns: true});
var promises = [];
for(var i = 0; i < records.length; i++) {
var placeName = records[i]['Place Name'];
promises.push(geocoder.geocodeAsync(placeName));
}

Promises.all(promises).then(function(result) {
result.forEach(function(geocodeResponse) {
console.log(geocodeResponse);
})
}

最佳答案

为了限制同时进行的并发请求数量,我建议使用 Bluebird 的 Promise.map(),它提供了并发选项。它将为您执行以下所有操作:

  1. 迭代您的数组
  2. 将并发请求数限制为您将并发选项设置为的值
  3. 将所有结果按顺序收集到最终结果数组中

使用方法如下:

const Promise = require('bluebird');

Promise.map(records, r => {
let placeName = r['Place Name'];
return geocoder.geocodeAsync(placeName));
}, {concurrency: 5}).then(results => {
// all results here
}).catch(err => {
// process error here
});

注意:速率限制通常与并发请求数并不严格相同。限制并发请求的数量将使您更有可能保持在速率限制之下,但并不能保证这一点。有特定的速率限制模块可以更直接地管理速率限制。

<小时/>

您可以使用 Bluebird 的 .delay() 为每个请求添加延迟。

const Promise = require('bluebird');

Promise.map(records, r => {
let placeName = r['Place Name'];
return geocoder.geocodeAsync(placeName)).delay(500);
}, {concurrency: 5}).then(results => {
// all results here
}).catch(err => {
// process error here
});
<小时/>

处理某些类型的速率限制的经典算法称为 leaky bucket algorithm .

<小时/>

如果您的限制是 50 个请求/秒,那么您只需确保并发数乘以延迟值决不允许超过 50 个/秒。

关于javascript - 如何使我可以在 javascript 中一次执行 10 个 promise ,以防止 api 调用的速率限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44666202/

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