1

Googlemap(v3)にマーカーを追加し、マーカーを追加した場所に関連する結果を持つオブジェクトを返す関数があります。この関数から返された成功値に基づいて、いくつかのロジックを記述する必要があります。しかし、geocoder.geocode は非同期的に実行されるため、結果が false として返され、ロジックが失敗します。同期的に行う方法はありますか?これが私のコードです:

 addMarkerAtGMap = function (positionParam, gMapObject, colorMarkerObj) {
       if (infoGMapMarkerWin !== undefined && infoGMapMarkerWin.open !== undefined) {
           infoGMapMarkerWin.close();
       }


// Set the success as false by default..here due to async call the success value is incorrectly returned as false 

 returnGMapObject = { success: false, latitude: "0", longitude: "0", gMapObject: gMapObject };     

       geocoder.geocode({ 'address': positionParam }, function (results, status) {
           if (status == google.maps.GeocoderStatus.OK) {
               map.setCenter(results[0].geometry.location);
               gMapObject = new google.maps.Marker({
                   icon: colorMarkerObj.markerImage,
                   shadow: colorMarkerObj.markerShadow,
                   position: results[0].geometry.location
               });
               gMapObject.setMap(map);
               google.maps.event.addListener(gMapObject, "click", function (event) {

                   if (infoGMapMarkerWin !== undefined && infoGMapMarkerWin.open !== undefined) {
                       infoGMapMarkerWin.close();
                   }
                   infoGMapMarkerWin = new google.maps.InfoWindow(
                        { content: positionParam,
                            size: new google.maps.Size(100, 100),
                            position: gMapObject.position
                        });
                   infoGMapMarkerWin.open(map);
               });
               returnGMapObject = { success: true, latitude: results[0].geometry.location.Xa, longitude: results[0].geometry.location.Ya, gMapObject: gMapObject };
           }
       });
       return returnGMapObject;
   }

$("#btnAddLocation").click(function () {
if (!PLVM.isValid()) {
    showMessage(PLVM.errors());
}
else {
    var address = $("#Addressline1").val();
    var colorMarkerObj = $Utils.colorMapMarker("FF8277");       // Add color to marker
    var gMapObject = $Utils.addMarkerAtGMap(address, locMarkerObj, colorMarkerObj);
    if (gMapObject.success == true) { 
// gMapObject.success returned as false due to asynchronous call which fails my logic 
        if (PLVM.Latitude() == gMapObject.latitude && PLVM.Longitude() == gMapObject.longitude) {
            locMarkerObj.setMap(null);
        }
        else {
            PLVM.Latitude(gMapObject.latitude);
            PLVM.Longitude(gMapObject.longitude);
            PartnerDetailsVM.addPL(PLVM);
        }
    }
}
return false;});
4

2 に答える 2

1

ジオコーダーは非同期で、何らかの理由でコールバックを提供します (サーバーからの応答を待っている間、ブラウザーを解放して他のことを行うため)。コールバック ルーチンでデータを使用するようにコードを構成します (使用可能な場合)。

于 2012-10-04T19:02:20.557 に答える
0

ロジックのコールバックルーチンを変更して解決したことは次のとおりです。

$("#btnAddLocation").click(function () {

if (!PLVM.isValid()) {
    showMessage(PLVM.errors());
}
else {
    var address = $("#Addressline1").val();

    var colorMarkerObj = $Utils.colorMapMarker("FF8277");       // Add color to marker

    $Utils.addMarkerAtGMap(address, locMarkerObj, colorMarkerObj, function (gMapObject) {

        if (gMapObject !== undefined && gMapObject.gMapObject !== undefined) {
            locMarkerObj = gMapObject.gMapObject;
        }
        if (gMapObject !== undefined && gMapObject.success) {
            markArr.push(locMarkerObj);
            PLVM.Latitude(gMapObject.latitude);
            PLVM.Longitude(gMapObject.longitude);
            PartnerDetailsVM.addPL(PLVM);
        }

    });
}
return false;

});

于 2012-10-05T07:16:28.780 に答える