我有一个在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;});
答案 0 :(得分:1)
地理编码器是异步的,并且出于某种原因提供回调(以便在等待来自服务器的响应时释放浏览器以执行其他操作)。构建代码以使用回调例程中的数据(当它可用时)。
答案 1 :(得分: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;
});