异步执行的函数需要使用回调来获取返回值 你那种想等待回调函数执行后再把结果作为返回值的想法是无法实现,并且是极不可取的 因为你并不知道需要多久该回调函数才能执行,让主线程阻塞在这儿等待不是一个正确的做法,万一通讯故障回调函数一直不执行怎么办?你的程序就卡死在这儿了?? 所以正确的做法还是在回调函数中获得值进行处理推荐写法: 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);//这儿就可以使用这个值了 } );
你那种想等待回调函数执行后再把结果作为返回值的想法是无法实现,并且是极不可取的
因为你并不知道需要多久该回调函数才能执行,让主线程阻塞在这儿等待不是一个正确的做法,万一通讯故障回调函数一直不执行怎么办?你的程序就卡死在这儿了??
所以正确的做法还是在回调函数中获得值进行处理推荐写法:
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);//这儿就可以使用这个值了
}
);
<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>
{
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));