1

リクエストごとに数百のアイテムをジオコーディングする必要があるアプリを実行しています。非常に素朴なことに、GoogleマップのジオコーディングAPIを呼び出すforループを実行しました。何が起こるかというと、私のコードは非常に短い時間でAPIに対してあまりにも多くの呼び出しを行うため、5〜10回の反復の後、ジオコーディングAPIはOVER_QUERY_LIMIT制限付きで応答します。Google APIリファレンスを参照すると、これは次の理由で発生します。

Webページが短期間でリクエスト制限を超えました。

私のループは現在次のようなものです:

for (var i = 0; i < dict.nodes.length; i++) {
    (function (i) {
        g.geocode({'address': dict.nodes[i].location}, function (results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
                dict.nodes[i]["geocoded_location"] = results
            }
        })
    })(i);
}

APIの制限を回避するために、sleep()関数のようなものを実装して、ジオコーディング関数の呼び出しをランダムに遅らせるにはどうすればよいですか。ばかげたwhileループを実装しましたが、CPUも泣きます。何か案は?

4

2 に答える 2

4

単純な を使用しsetIntervalて、100msごとに設定しないのはなぜですか?

var i = 0;

var setAPI = setInterval( function () { 

    if ( i < dict.nodes.length ) {
        g.geocode({'address': dict.nodes[i].location}, function (results, status) {
             if (status == google.maps.GeocoderStatus.OK) {
                dict.nodes[i]["geocoded_location"] = results
             }
        });
    }

    i++;

  }, 
100); //100ms delay

これで、いつでもclearInvterval(setAPI);実行を停止できます。

EngineersetTimeout を使用して、指摘されているように関数を呼び出すのと非常によく似ています。

于 2012-07-27T15:05:16.937 に答える
2

forループの代わりに、次のようなものを実装できます。

(function nextCall(i){
    if(i < dict.nodes.length){
        g.geocode({'address': dict.nodes[i].location}, function (results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
                dict.nodes[i]["geocoded_location"] = results;
            }
        });
        setTimeout(function(){   nextCall(i+1)   },100);
    }
})(0);

もちろん、'100'遅延で限界を超えてしまう場合は、増やすことができます。

于 2012-07-27T15:10:52.950 に答える