JavaScript回调不按顺序触发

时间:2014-06-16 09:35:52

标签: javascript callback

我以为我终于找到了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

1 个答案:

答案 0 :(得分:1)

checkForMaxAccuracy(
    doUpdate(locationId,"position")
);

doUpdate的返回值作为checkForMaxAccuracy的参数传递。换句话说,您没有传递回调函数本身,而是返回它的返回值。

你能做的是:

checkForMaxAccuracy(
    function() {
        doUpdate(locationId,"position")
    }
);