-1

私はNode.jsでバックエンドAPIを作成していますが、その最も優れた機能である非同期関数は、新しい問題で私に挑戦しています。

ID、緯度、経度の情報を持つPersonというオブジェクトのリストがあります。そして、私が単純にやりたいのは、特定のポイント(ポイントAとしましょうまでの距離に従ってそれらをソートすることです。

各オブジェクトをループしたい場合は、リクエストを作成します(モジュールリクエストを使用しています。ここでチェックインできます)。ただし、その性質上、Nodeは最初にすべてのオブジェクトをループし、要求を送信し、応答を待ちません。ですから、返事が来たとき、私はどの返事が誰のためのものか理解できません。Redisを確認すると、IDが正しい順序でリストされていますが、GoogleAPIリクエストの応答が順序付けられていないことがわかります。理解を深めるための私のコードは次のとおりです。

for(var i = 0;i < result.length;i++){

    console.log("the iteration time: "+i);
    tempObject = JSON.parse(result[i]);

    console.log("\n I make the request for key: "+tempObject.ID);
    request('http://maps.googleapis.com/maps/api/directions/json?origin='+tempObject.lat+
    ','+tempObject.lon+'&destination=' + targetLatitude + ',' + targetLongitude 
    + '&sensor=false', 
    function (error, response, body) {
      if (!error && response.statusCode == 200) {

            console.log("Lat: "+tempObject.lat);
            console.log("Lon: "+tempObject.lon);

            console.log("key: "+list[counter]);
            tempObj = JSON.parse(body);

            counter++; //For loop end check

            console.log("i: "+i);


            duration = tempObj.routes[0].legs[0].duration.value;


            console.log("Duration: "+tempObj.routes[0].legs[0].duration.value+"\n");

            if(counter == result.length){
                //end loop
            }

        }
    });
}

私は自分のコードに問題がないことを述べたいと思います。この問題の解決策が見つかりません。GoogleMapsDirectionAPIからの応答が注文されていない場合、PersonリストのIDを取得するにはどうすればよいですか。Loopは、リスト内のPersonオブジェクトごとに1つずつリクエストを行いますが、Googleからの応答が正しくないため、IDを取得できません

オブジェクトをリストに入れたいと思ったのですが、後でAPI応答で開始点latとlongをチェックし、リスト内のPersonと比較することで、誰の応答が最初に来たかを特定できましたが、それはうまくいきませんでした。良い。助言がありますか?

PS:「キー」という単語が表示されている場合、それはユーザーのIDを意味します。私はRedisを使用しているので、「キー」も使用する傾向があります。

4

1 に答える 1

0

関数クロージャを使用して、リクエストをレスポンスに関連付けることができます。

ジオコーディングされた住所の使用例: http://www.geocodezip.com/v3_geocoder_multiplePoints.html

于 2012-10-16T13:05:34.573 に答える