Я пытаюсь получить долготу и широту из списка адресов с API Google через скрипт Node.js. Сам вызов работает нормально, но поскольку у меня есть около 100 адресов для отправки. Я использую async.forEach
в массиве, но вызовы выполняются слишком быстро, и я получаю сообщение об ошибке «Вы превысили лимит скорости для этого API».Выполнение forEach как водопад в async
Я обнаружил, что количество вызовов ограничено 2500 каждые 24 часа и максимум 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
почти в то же время, и поэтому он ничего не меняет ...
The async.waterfall
выглядит она сделал бы трюк, но дело в том, что я точно не знаю, сколько строк у меня будет, поэтому я не могу перекодировать все вызовы функций. И если честно, это сделало бы мой код действительно уродливые
Вы пробовали рекурсию? Используйте обратный вызов для установки тайм-аута для рекурсивного вызова функции выборки после 100 мс. –
Это похоже на достаточно общую проблему, которая подходит для общего решения. Ограничение скорости - это обычная конструкция, и встроенные скрипты setTimeout, вероятно, не подходят. Водопад может быть медленнее или быстрее, чем необходимо, поскольку все, что он делает, - это ожидание возврата последнего вызова. Если вызов занимает менее 1/10 секунды, вы все еще слишком быстр. –
Почему не так просто, как 'parallel' с 10 поставленными в очередь, когда они завершены, убедитесь, что прошло всего 10 секунд, прежде чем запускать следующую партию? – WiredPrairie