让程序暂停一段时间,不让程序往下走,如果用setTimeout("check()",1000),当程序执行完函数check(),在等待1S中的过程中,程序会继续往下执行。代码,调用的百度地图api
var addre ="";
var bm = new BMap.Map("container");
gpsxy = function (xx,yy,i){
var gpsPoint = new BMap.Point(xx,yy);
bm.clearOverlays();
var marker = new BMap.Marker(gpsPoint);
bm.addOverlay(marker);
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();
alert(addre);
return addre;
}
function check()
{
if(addre=="")
{
setTimeout("check()",1000);
alert(123);
}
}
百度地图的反向地址解析函数执行过程中,程序继续往下执行check(),所以我想做个延迟函数,让程序停在这,等addre值不为空时,再返回的值,请问该如何解决?
------解决方案--------------------
js似乎没有休眠这一概念吧。。。
楼主为什么不用回调机制呢?等你的地图加载好了,再触发一个回调函数不就OK了嘛。。。
实在是要强行实现楼主的效果的话,我想大概只能用循环了,用循环不断的去判断addre,直到addre有值再跳出循环,但是这样太耗CPU了。。。不可取哦。。。
------解决方案--------------------
异步执行的函数需要使用回调来获取返回值
你那种想等待回调函数执行后再把结果作为返回值的想法是无法实现,并且是极不可取的
因为你并不知道需要多久该回调函数才能执行,让主线程阻塞在这儿等待不是一个正确的做法,万一通讯故障回调函数一直不执行怎么办?你的程序就卡死在这儿了??
所以正确的做法还是在回调函数中获得值进行处理
推荐写法:
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 marker = new BMap.Marker(gpsPoint);
bm.addOverlay(marker);
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);//这儿就可以使用这个值了
}
);
------解决方案--------------------
回调来解决这个问题是比较合理的,我也写了一个
- HTML code
<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>