回调函数中如何引用以前的变量

5 views
Skip to first unread message

秦志坚

unread,
Nov 22, 2009, 1:47:24 AM11/22/09
to Google-Map...@googlegroups.com
geru们好!
在下面的循环体中,会设置变量addrinfo,然后在回调函数中会引用到此变量,但下一次循环的执行比回调函数的执行快,所以,当回调函数执行时,变量值已发生了变化。
请问:如何在回调函数中引用以前的变量值?
是否可在回调函数中引入参数?
另一种解决方法是:延迟下一次循坏的执行,但因为不能确切知道回调函数何时返回,所以还是有出错的可能。
是否有妥当的解决办法?

for (i=0;i<addrLength;i++) {
       var addrInfo = allAddr[i];
      geocoder.getLatLng(addrInfo.ad,function(point1) {
            if (!point1) {
                 alert("该地址不能解析: " + addrInfo.ad);
            } else {
                    map.setCenter(point1, iZoomLevel);
                    var marker1 = new GMarker(point1);
                    map.addOverlay(marker1);
                    var infoDiv1 = document.createElement("div");
                    infoDiv1.innerHTML = "时间:"+addrInfo.pt+"<br>电话:"+addrInfo.pn+"<br>地址:"+addrInfo.ad;                 
                    GEvent.addListener(marker1,"mouseover",function(){marker1.openInfoWindow(infoDiv1);});
                    GEvent.addListener(marker1,"mouseout", function(){marker1.closeInfoWindow();});
             }
      });
}

--
Best Regards
Daniel Qin 

李白,字一日

unread,
Nov 22, 2009, 9:29:23 PM11/22/09
to 谷歌地图 API 论坛
这个一个闭包的问题.
解决的办法可以通过封装函数来实现.
参考置顶的月度总结.

假设你所需要的是marker1,
那么利用javascript闭包.

可以定义一个函数
var onMouseOver = function(marker, info){
return function(){
marker.openInfoWindow(info);
}
}

然后将event修改成这样:
GEvent.addListener(marker1,"mouseover", onMouseOver(marker1,
infoDiv1));


On 11月22日, 下午2时47分, 秦志坚 <qin...@gmail.com> wrote:
> geru们好!
> 在下面的循环体中,会设置变量addrinfo,然后在回调函数中会引用到此变量,但下一次循环的执行比回调函数的执行快,所以,当回调函数执行时,变量值已发 生了变化。
> 请问:如何在回调函数中引用以前的变量值?
> 是否可在回调函数中引入参数?
> 另一种解决方法是:延迟下一次循坏的执行,但因为不能确切知道回调函数何时返回,所以还是有出错的可能。
> 是否有妥当的解决办法?
>
> for (i=0;i<addrLength;i++) {
> var addrInfo = allAddr[i];
> geocoder.getLatLng(addrInfo.ad,function(point1) {
> if (!point1) {
> alert("该地址不能解析: " + addrInfo.ad);
> } else {
> map.setCenter(point1, iZoomLevel);
> var marker1 = new GMarker(point1);
> map.addOverlay(marker1);
> var infoDiv1 = document.createElement("div");
> infoDiv1.innerHTML =
> "时间:"+addrInfo.pt+"<br>电话:"+addrInfo.pn+"<br>地址:"+addrInfo.ad;
>

> GEvent.addListener(marker1,"mouseover",function(){marker1.openInfoWindow(in foDiv1);});

秦志坚

unread,
Nov 22, 2009, 11:28:38 PM11/22/09
to google-map...@googlegroups.com
问题已解决。
实际上,封装函数要把(调用回调函数的语句)封装在函数体内,并把回调函数中用到的外部变量作为封装函数的参数。这样处理好像有点奇怪。
感谢李白的提醒。

2009/11/23 李白,字一日 <cali...@gmail.com>

李白,字一日

unread,
Nov 23, 2009, 4:46:16 AM11/23/09
to 谷歌地图 API 论坛
如果 觉得不好看,把每个marker整体传到参数里也是可以的.
然后把addListener也放在函数里,这样就可以写的好看一点.

你这个写法还有一个问题是你的请求会失败.

要一次查询多个地址的话,可以参考一下这个页面.

http://ip13800.appspot.com/?act=geo

上面有一次解析400多个地址的示例.

On 11月23日, 下午12时28分, 秦志坚 <qin...@gmail.com> wrote:
> 问题已解决。
> 实际上,封装函数要把(调用回调函数的语句)封装在函数体内,并把回调函数中用到的外部变量作为封装函数的参数。这样处理好像有点奇怪。
> 感谢李白的提醒。
>

> 2009/11/23 李白,字一日 <calid...@gmail.com>

秦志坚

unread,
Nov 23, 2009, 8:48:23 AM11/23/09
to google-map...@googlegroups.com
对的,循环请求如果数量少的话,出错的概率不大,但数量大的话,服务器来不及响应或有相应的限制,那么后面的循环就会出错。
参考页面中的做法是在得到服务器的响应后,再发送下一个请求,即要在回调函数中反调原来的函数。
448个请求用了一分钟时间,即每个请求大概费时134ms;448个marker标在地图上用了7秒钟时间,每个标注费时16ms。
应该说,这样的速度还是可以接受的。


2009/11/23 李白,字一日 <cali...@gmail.com>



--
Best Regards
Daniel Qin   秦志坚                                  
    Mobile:13901875450                            
    EMAIL:qin...@gmail.com
    MSN:danie...@hotmail.com                  
上海紫华计算机发展有限公司
    GPS车辆管理:www.513gs.com
    电信增值服务商:光纤宽带接入、短信通、移动总机、IDC
    200126 浦东软件园三林世博分园(灵岩南路295号)24409室
    TEL:021-51089282,68521248
Reply all
Reply to author
Forward
0 new messages