0

私はJavascriptコーディングが初めてで、この情報を多くの場所で探しましたが、有効な解決策が1つも見つからなかったため、この質問をここに投稿しています.

for ループで、リージョン (ルートの区間) で POI をリクエストしようとしています -

service.search(request, callback);

リクエストには、クエリ対象の POI の場所やタイプなどのパラメータが含まれます。以下のようにコールバック関数を実装しました -

function callback(myResults, status) {
    if (status == google.maps.places.PlacesServiceStatus.OK) {
        alert('myResults: ' + myResults.length);
        // entire remaining code here, where I do some processing on the POIs.
    }   
}

このコードは機能しており、ルートの各区間で POI が表示され、アラートを使用して POI の数も表示されます。

私の問題は、ここで各区間の「myResult」を処理するのではなく、ルート全体 (多くの区間で構成される) のすべての結果を収集してから、一度に処理を行うことです。

  1. 最初に、グローバル変数 (「myPOIs」) を作成し、各区間に「myResults」を追加し、ルート全体が解析されたら、この myPOIs を処理することを考えましたが、これを追加することはできません (または方法がわかりません)。 myResults をグローバル変数 myPOIs に。

  2. 私が考えていたもう 1 つのオプションは、コールバック関数から戻り値 (myResults) を取得し、すべての結果を収集 (追加) することです。

1 と 2 の唯一の違いは、1 では if 条件内に myResults を追加するグローバル変数であり、2 では if 条件が true の場合は myResults を service.search に返し、収集することです。そこでの結果。

myPOIs.push(myResults) と他のいくつかのオプションを使用してみましたが、myPOIs.length を確認すると常に null です。コールバック関数から myResults を取得する方法が本当にわかりません。

提案/考え/ヘルプは私にとって非常に役立ちます。

そして、これにはjavascriptのみを使用し、他には何も使用したくありません。

事前にどうもありがとう、斧

4

3 に答える 3

2

検索を次のように呼び出していると仮定します。

for (var i = 0; i < legs.length; i++) {
    service.search(legs[i], callback);
}

次に、すべての結果とコールバックされた回数を追跡することでこれを行うことができます。

var callbacksOutstanding = legs.length;
var allPlaces = [];
var callback = function(legPlaces, status) {
    if (status == google.maps.places.PlacesServiceStatus.OK) {
        allPlaces.push.apply(allPlaces, legPlaces);
    } 
    if (--callbacksOustanding === 0) {
        processPlaces(allPlaces);
    }
};
for (var i = 0; i < legs.length; i++) {
    service.search(legs[i], callback);
}

オブジェクトprocessPlacesの完全な配列を処理するために作成した関数はどこにありますか。PlaceResult

Javascript では、他の関数内に関数を定義することができ、また定義する必要があるため、これがすべて関数にラップされている場合、3 つのvarステートメントはグローバル変数ではありません(そうあるべきです)。そうする場合、内部関数は外部関数の変数にアクセスできます。したがって、私にとっては、これは次のようになります。

function findAndProcessPlaces(legs) {
    var callbacksOutstanding = legs.length;
    var allPlaces = [];
    var callback = function(legPlaces, status) {
        if (status == google.maps.places.PlacesServiceStatus.OK) {
            allPlaces.push.apply(allPlaces, legPlaces);
        } 
        if (--callbacksOustanding === 0) {
            processPlaces(allPlaces);
        }
    };
    for (var i = 0; i < legs.length; i++) {
        service.search(legs[i], callback);
    }
}

注意: このallPlaces.push.apply行は、ある配列から別の配列へのインプレース連結を実行します。次のように書くこともできます。

allPlaces = allPlaces.concat(legPlaces)

この時点で。

于 2012-07-01T22:56:03.497 に答える
0

グローバル変数を作成します。

var POIResults = [];

関数のコールバックで

POIResults.push(myResults);

後で都合のよいときに、配列を反復する関数を呼び出します

function checkResults(){
 for(var i = 0; i < POIResults.length; i++){
  //TODO: check POIResults[i]
 }
} 
于 2012-07-01T21:43:48.267 に答える
0

コールバックの外側で適切なスコープ内で定義された配列は、トリックを行う必要があります。グローバル配列アプローチでコードを投稿できますか?

于 2012-07-01T21:48:02.487 に答える