异步执行的函数需要使用回调来获取返回值你那种想等待回调函数执行后再把结果作为返回值的想法是无法实现,并且是极不可取的因为你并不知道需要多久该回调函数才能执行,让主线程阻塞在这儿等待不是一个正确的做法。
正确的做法还是在回调函数中获得值进行处理推荐写法:
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.streetNumbercheck()
if(callback) callback(addre)//把addre传递到回调函数中,这样就可以在函数外部使用返回值了 })}
调用示范:gpsxy(10,10,1,function(addre){ alert(addre)//这儿就可以使用这个值了 })
死循环就是循环条件一直为true,程序进入循环体的代码执行后就不能终止。
以下是事例,变量i 一直小于1.
<script>for(i=0i<1i--)
{
alert("msg")
}
</script>
首先你得明白阻塞指的是什么, nodejs里面的阻塞指的的I/O阻塞, 比如 文件读写, 网络流量等, 在你的观念里面,以为什么都可以阻塞是错误的, js的for循环中如果进行的是IO操作,那么,它也是非阻塞的。 基本在所有的程序语言里面,计算型的操作都是阻塞的,cpu 需要持续不断的工作才能完成 数据计算。
举个简单的例子来说明for的阻塞和非阻塞情况。(这里用setTimeout 来模拟
操作)
#阻塞型for(var i = 0 i < 10i++ ){console.log(i)}
输出: 1,2,3 ...10
#非阻塞型
for(var i = 0 i < 10i++){
setTimeout(function(){
console.log(i)
}, 10-i)
}
输出: 10, 9, ...0 #在实际中可能是这样的顺序,也可能不是的,因为无法预估 IO完成的实际时间。