私は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を使用しているので、「キー」も使用する傾向があります。