我需要在函数之外使用一个变量。我已经读过老问题了,但仍然找不到合适的解决方案。
这是代码:
<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>
警报显示"未定义"。我不仅需要在警报中获取该变量,还需要在就绪函数之外的另一个"仓库"值中获取该值。
如果是重复的话,我很抱歉,但正如我所说,我读到的答案不符合要求。
编辑:为了完整起见,我描述了详细信息,将警报替换为我必须调用的读取函数。
正如我在评论中所说,我实际上在使用谷歌地图API及其功能。我要做的是将变量传递到$(document).ready
函数之外,因为我需要在外部脚本中使用它。
问题是,我必须调用的外部js函数是随着窗口加载而加载的Google Maps函数(initialize()
),所以我必须在$ready函数之后找到调用该函数的方法。
因为@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中的自定义事件
这就是异步的含义。
在完成ajax请求之前,您将向warehouseLat
发出警报。
你应该在request
成功完成后再做!!
$.ajax({
type:"POST",
url:"${pageContext.request.contextPath}/users/findWarehouseLat",
success:function(data){
warehouseLat = data;
alert(warehouseLat);
}
});
这是我通过@milkshake和其他善意用户的评论找到的解决方案。
首先,我把我所有的谷歌地图脚本放在一个外部.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();
});
}
});
});
所以时间是这样的:
- 谷歌监听器
- Ajax调用返回仓库地址
- 当我得到仓库地址时,我将其存储在warehouseAddress变量中,并对其进行地理编码(从地址字符串中提取坐标)
- 我调用谷歌地图初始化函数,这样我的变量就可以被它使用了
它有效。但还有更好的方法可以做到这一点,所以如果你有更好的解决方案,我很乐意阅读你的评论:)