gpt4 book ai didi

javascript - 像异步 waterfall 一样执行 forEach

转载 作者:数据小太阳 更新时间:2023-10-29 04:46:17 27 4
gpt4 key购买 nike

我正在尝试通过 Node.js 脚本使用 Google API 从地址列表中检索经度和纬度。调用本身工作正常,但因为我有大约 100 个地址要提交。我在数组上使用 async.forEach,但调用速度太快,我收到错误消息“您已超出此 API 的速率限制。”

我发现调用次数限制为每 24 小时 2500 次,每秒最多 10 次。虽然我可以接受每天 2500 次,但我的通话速度对于速率限制来说太快了。

我现在必须编写一个函数来延迟调用,以免达到限制。这是我的代码示例:

async.forEach(final_json, function(item, callback) {
var path = '/maps/api/geocode/json?address='+encodeURIComponent(item.main_address)+'&sensor=false';
console.log(path);
var options = {
host: 'maps.googleapis.com',
port: 80,
path: path,
method: 'GET',
headers: {
'Content-Type': 'application/json'
}
}
// a function I have who makes the http GET
rest.getJSON(options, function(statusCode, res) {
console.log(res);
callback();
});
}, function() {
// do something once all the calls have been made
});

您将如何着手实现这一目标?我尝试将我的 rest.getJSON 放在 100 毫秒的 setTimeout 中,但是 forEach 遍历所有行的速度如此之快,以至于它启动了所有 setTimeout 几乎同时进行,因此它不会改变任何东西......

async.waterfall 看起来可以解决问题,但问题是我不知道我将拥有多少行,所以我无法对所有函数调用进行硬编码。老实说,这会使我的代码变得非常丑陋

最佳答案

这个想法是你可以创建一个 rateLimited 函数,它的行为很像一个 throttleddebounced 函数,除了任何不当速率限制时间段到期时,立即执行排队并按顺序运行。

基本上,它创建并行的 1 秒间隔,通过计时器重新安排 self 管理,但最多只允许 perSecondLimit 间隔。

function rateLimit(perSecondLimit, fn) {
var callsInLastSecond = 0;
var queue = [];
return function limited() {
if(callsInLastSecond >= perSecondLimit) {
queue.push([this,arguments]);
return;
}

callsInLastSecond++;
setTimeout(function() {
callsInLastSecond--;
var parms;
if(parms = queue.shift()) {
limited.apply(parms[0], parms[1]);
}
}, 1010);

fn.apply(this, arguments);
};
}

用法:

function thisFunctionWillBeCalledTooFast() {}
var limitedVersion = rateLimit(10, thisFunctionWillBeCalledTooFast);

// 10 calls will be launched immediately, then as the timer expires
// for each of those calls a new call will be launched in it's place.
for(var i = 0; i < 100; i++) {
limitedVersion();
}

关于javascript - 像异步 waterfall 一样执行 forEach,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20008841/

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