js似乎没有休眠这一概念吧楼主为什么不用回调机制呢?等你的地图加载好了,再触发一个回调函数不就OK了嘛实在是要强行实现楼主的效果的话,我想大概只能用循环了,用循环不断的去判断addre,直到addre有值再跳出循环,但是这样太耗CPU了不可取哦

解决方案 »

  1.   

    异步执行的函数需要使用回调来获取返回值
    你那种想等待回调函数执行后再把结果作为返回值的想法是无法实现,并且是极不可取的
    因为你并不知道需要多久该回调函数才能执行,让主线程阻塞在这儿等待不是一个正确的做法,万一通讯故障回调函数一直不执行怎么办?你的程序就卡死在这儿了??
    所以正确的做法还是在回调函数中获得值进行处理推荐写法:
    var addre ="";
    var bm = new BMap.Map("container");
    gpsxy = function (xx,yy,i,callback){//添加一个参数作为回调函数,该函数可以获取addre参数  
      var gpsPoint = new BMap.Point(xx,yy);
        
      bm.clearOverlays();
      var er = new BMap.Marker(gpsPoint);
      bm.addOverlay(er);
      bm.setCenter(gpsPoint);   
      var gc = new BMap.Geocoder();   
      gc.getLocation(gpsPoint, function(rs){
      var addComp = rs.addressComponents;
      addre = addComp.province + ", " + addComp.city + ", " + addComp.district + ", " + addComp.street + ", " + addComp.streetNumber;
          check();
      if(callback) callback(addre);//把addre传递到回调函数中,这样就可以在函数外部使用返回值了
      });  
    }调用示范:
    gpsxy(10,10,1,function(addre){
                    alert(addre);//这儿就可以使用这个值了
                  }
    );
      

  2.   

    回调来解决这个问题是比较合理的,我也写了一个<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title></title>
        <script src="../jquery/jquery-1.7b2.js" type="text/javascript"></script>
        <script type="text/javascript">
            $(function () {
                //数据检查
                function Check() {
                    return $("#txtName").val();
                }
                var timerID = null;
                //等待检查完成
                function WaitingToCheck(callback) {
                    var checkResult = Check();
                    if (checkResult && checkResult != "") { //符合条件回调
                        if (callback && $.isFunction(callback)) {
                            if (timerID) {
                                clearTimeout(timerID);
                            }
                            callback();
                        }
                        return;
                    }
                    timerID = setTimeout(function () {
                        WaitingToCheck(callback);
                    }, 1000);
                }
                //
                WaitingToCheck(function () {
                    alert("符合条件");
                    //继续执行下
                });        });
        </script>
    </head>
    <body>
        <input id="txtName" type="text" />
    </body>
    </html>
      

  3.   

    百度不是有回调函数,放你的check函数进入回调里面执行就好了,要不就需要setTimeout定时检查变量是否为空了
      

  4.   

    现在我写了一个回调函数,就是执行check的时候回调TestCallBack()方法,里面的gc.getLocation方法是百度的api获得反解析地址的,在TestCallBack()定义了一个返回值,但是接收不到,因为gc.getLocation方法是异步的,在方法里面把值放在隐藏域里,在外面取也取不到,该如何才能得到反解析出来的地址呢??function TestCallBack(gpsPoint)
    {
     
        var gc = new BMap.Geocoder();   
        var addre;
     gc.getLocation(gpsPoint, function(rs){
            var addComp = rs.addressComponents;
            addre = addComp.province + ", " + addComp.city + ", " + addComp.district + ", " + addComp.street + ", " + addComp.streetNumber;
            alert(addre+"反解析地址GPsXY");
        //  var addr = "locationXH"+i;
        //  document.getElementById(addr).value=address;
         document.getElementById("address").value=addre;
        //// return addre; 
        });
      
     
     return addre;
    }function check(callback)
    {
    var address = callback;
    //alert("callback");     
        //  var addr = "locationXH"+i;
        //  document.getElementById(addr).value=address;
        //  return addre;
        address = document.getElementById("address").value;
     alert("蛸蛸"+address);
        return address;
        
    }//调用var a =   check(TestCallBack(gpsPoint));