0

我需要在其函数之外使用一个变量。我已经阅读了较旧的问题,但我仍然找不到合适的解决方案。

这是代码:

<script>

var warehouseAddress;

$(document).ready(function(){

$.ajax({
    type:"POST",
    url:"${pageContext.request.contextPath}/users/findWarehouseAddress",  
    success:function(data){
        warehouseAddress = data;
    }
}); 

alert(warehouseAddress);

});

var warehouse = warehouseAddress;

</script>

警报给了我“未定义”。我不仅需要在警报中获取该变量,还需要在就绪函数之外的其他“仓库”值中获取该变量。

抱歉,如果它是重复的,但正如我所说,我无法用我阅读的答案来做到这一点。

编辑:为了完整起见,我描述了细节,用我必须调用的读取函数替换警报。

正如我在评论中所说,我实际上是在使用 Google Maps API 及其功能。我要做的是将变量传递到$(document).ready函数之外,因为我需要在外部脚本中使用它。

问题是我必须调用的外部 js 函数是一个谷歌地图函数 ( initialize()),它在窗口加载时加载,所以我必须找到一种在 $ready 函数之后调用该函数的方法。

4

3 回答 3

2

正如@putvande 已经说过 ajax 是异步的,所以最好的办法是利用回调(基于事件:D)

$.ajax({
    type:"POST",
    url:"${pageContext.request.contextPath}/users/findWarehouseLat",  
    success: myDataHandler(data)
}); 

function myDataHandler(data){
    warehouseLat = data;
    //do something with the data here :D as it now exists
    alert(warehouseLat);
}

看看这个:jquery中的自定义事件

于 2013-08-08T08:51:13.563 回答
1

这就是异步的意思。

在完成 ajax 请求之前,您正在提醒您的warehouseLat.

您应该在request成功完成后进行!

   $.ajax({
        type:"POST",
        url:"${pageContext.request.contextPath}/users/findWarehouseLat",  
        success:function(data){
            warehouseLat = data;
           alert(warehouseLat);
        }
    }); 
于 2013-08-08T08:45:59.230 回答
0

感谢@milkshake 和其他善良的用户评论,这是我找到的解决方案。

首先,我将我所有的 Google 地图脚本放在一个外部 .js 文件中。为了代码的可读性,我需要这样做。

在该文件中,我只是使用 Google Api 的 addDomListener 函数在正确的时间加载我需要的内容,以避免 ajax 调用和方法执行之间的时间错误。

google.maps.event.addDomListener(window, 'load', function(){

    $.ajax({
        type:"POST",
        url:contextPath+"/products/findWarehouseAddress",  
        success:function(data){
                    warehouseAddress = data;
                    geocoder.geocode({'address': warehouseAddress }, function(results) {
                        warehouse = results[0].geometry.location;
                        initialize();
                    });
        }
    });
});

所以时间是这样的:

  1. 谷歌监听器;
  2. Ajax调用返回仓库地址;
  3. 当我得到仓库地址时,我将它存储在warehouseAddress 变量中并对其进行地理编码(从地址字符串中提取坐标);
  4. 我调用谷歌地图初始化函数,以便它可以使用我的变量。

有用。但是可能有更好的方法来做到这一点,所以如果你有更好的解决方案,我会很高兴阅读你的评论:)

于 2013-08-09T18:07:11.250 回答