我以为我终于找到了JavaScript回调,因为我找到了一个用途,但它不按顺序发射。
在Google地图应用程序中,我有一个功能,可以在允许用户存储标记的(新)位置之前检查地图是否缩放到最大级别。
检查功能是:
function checkForMaxAccuracy(nextOperation) {
// Check at full zoom and alert if not
maxZoomService.getMaxZoomAtLatLng( newLocationMarker.getPosition(), function(response) {
var levelToZoomTo;
if (response.status != google.maps.MaxZoomStatus.OK) {
alert("Please ensure you are at maximum zoom to ensure most accurate placement possible.");
// continue after this alert as Mao could be fully zoomed but zoom service not reporting correctly
} else {
//alert("The maximum zoom at this location is: " + response.zoom);
if (response.zoom > map.getZoom()) {
alert("You must be zoomed in to the maximum to ensure most accurate placement possible before saving.\n\n Click [ Zoom here ] in theInfo Window to zoom to the maximum.");
// return after this error as Mao is definitely not fully zoomed
return;
}
// Call the update function to do the saving to the database
nextOperation();
}
});
}
其中nextOperation是回调函数。
这是由两个不同的函数调用的,第一个和最简单的(因为它还没有完全编写)完美地工作:
function saveNewLocation() {
checkForMaxAccuracy(function () {
alert("save new");
});
}
如果没有完全放大,我会收到检查功能显示的警告信息。如果地图已完全缩放,我会收到警告并保存新的'显示的消息,它是代码进行数据库更新的占位符。
但是,也可以从更完整的功能调用相同的检查功能。当用户更新现有标记的位置时,将调用此其他函数。
第二个函数实际上设置了HTML onclick
对象的span
属性 - 根据发生的情况有效启用和禁用保存控件。
在此功能中,我按如下方式设置onclick
:
document.getElementById('savePosition'+locationId).onclick = (state)?function(){checkForMaxAccuracy(doUpdate(locationId,"position"));}:null;
在这种情况下,当我点击相应的span
元素时,doUpdate()
函数会在checkForMaxAccuracy()
函数之前被触发。
(使用三元运算符的道歉..我知道如果让事情有点难以阅读,但我会在我的代码中离开,以防我的包围或语法略有错误这就是造成我问题的原因。)
我的猜测是,在我的理解中,我得到了一些根本错误的东西。回调函数。
任何人都可以解释我做错了吗?
-FM
答案 0 :(得分:1)
checkForMaxAccuracy(
doUpdate(locationId,"position")
);
将doUpdate
的返回值作为checkForMaxAccuracy
的参数传递。换句话说,您没有传递回调函数本身,而是返回它的返回值。
你能做的是:
checkForMaxAccuracy(
function() {
doUpdate(locationId,"position")
}
);