在使用百度api查询多个地址的经纬度的时候,由于百度api提供的经纬度查询方法是回调函数,并且后续操作必须等经纬度获取完成才能进行,问题就存在于怎么判断所有地点是否都回调完成了,问了之前的一个前端大佬同事(我是一只前端弱鸡),给我提供的思路,在百度api的回调函数里面再调一次自定义的回调函数,从而在自定义的函数里面进行判断所有地点是否都回调完成了。
下面是具体代码,
1 <script> 2 //所有待查询经纬度的地点 3 var allAddress=new Array("北京西站","成都东站","上海南站","西安北站"); 4 //回调前计数用 5 var callbackBefore = 0; 6 //回调后计数用 7 var callbackAfter = 0; 8 //存放经纬度 9 var geoCoord={}; 10 //循环所有地址 11 for (var i = 0; i < allAddress.length; i++) { 12 //先判断是否已经查询了经纬度(排重) 13 if (!(allAddress[i] in geoCoord)) { 14 //去调百度api,查经纬度了,先记个数 15 callbackBefore++; 16 GetPoint(allAddress[i], function (address, point) { 17 //回调回来了,经纬度,再记个数 18 callbackAfter++; 19 geoCoord[address] = point; 20 //判断回调之前的数目和回调之后的数目是否一样,一样就表示所有地址都查询完了 21 if (callbackBefore == callbackAfter) { 22 //去做你想做的操作了吧 23 //Travel(geoCoord); 24 return; 25 } 26 }); 27 } 28 29 } 30 //查询经纬度的函数 31 function GetPoint(address, callback) { 32 var local = new BMap.LocalSearch(address, 33 { 34 //智能搜索,这本来就是一个回调的方法 35 "onSearchComplete": function (obj) { 36 //存放经纬度 37 var point = []; 38 if (obj && obj.getPoi(0)) { 39 var pp = obj.getPoi(0).point; 40 point.push(pp.lng); 41 point.push(pp.lat); 42 //回调方法 43 callback(address, point); 44 } 45 } 46 }); 47 local.search(address); 48 } 49 </script>
我实际情况是那个地址allAddress比较复杂,需要二次循环,不像上面例子这么简单,所以才使用的这种方法。