Google APIでNode.jsスクリプトを使用して住所のリストから経度と緯度を取得しようとしています。呼び出し自体は正常に動作しますが、約100個のアドレスを送信する必要があります。配列でasync.forEach
を使用していますが、呼び出しが速すぎるため、「このAPIのレート制限を超過しました」というエラーが表示されます。forEachを非同期の滝のように実行します。
コール数は、24時間ごとに2500回、最大10秒間に制限されています。私は1日2500人でOKですが、私は自分の通話料金がレート制限のために速すぎるようにします。
私は今、制限に達することができないほどコールを遅らせる機能を書く必要があります。ここに私のコードのサンプルです:
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
});
これを達成するためにどのように進めますか?私はasync.waterfall
はそれのように見えます
...それは同時に、ほぼすべてのsetTimeout
を開始し、したがって、それは何も変更しないように速く、すべての行を私の100msのsetTimeout
内部rest.getJSON
が、forEach
繰り返し処理を入れてみましたそのトリックを行うだろうが、私はどのくらいの行を持っているのか分からないので、すべての関数呼び出しをハードコードすることはできません。そして、正直に言うと、それは私のコードが本当に醜くなるだろう
再帰を試みましたか?コールバックを使用して、100ms後に再帰的にfetch関数を呼び出すタイムアウトを設定します。 –
これは、一般的な解決策が適切である十分な一般的な問題のようです。レート制限は一般的な構造であり、インラインsetTimeoutハックはおそらく正しい方法ではありません。滝は最後の呼び出しが戻るのを待つため、必要以上に遅くなったり、速くなったりする可能性があります。通話が1秒間に10分の1以下になると、あなたはまだ速すぎます。 –
10個のキューを持つ 'parallel'のような単純なものではなく、次のバッチを開始する前に合計10秒が経過していることを確認してください。 – WiredPrairie