js调用百度地图API,由于异步执行导致结果顺序不对以及数据丢失

download0322 2014-07-09 08:27:43
利用百度地图API(geocoder里的getlocation函数)对一个文件里面约2W个坐标点进行解析,并将解析的结果输出到另一个文件。
现在有两个问题
第一,百度地图的这个API好像是异步执行的?导致我输出的坐标顺序和输入的顺序不一样了。。。
第二,我输入了2W个点,输出却只有大约8000个点,怎么会呢?
我现在想等getlocation这个函数在服务器解析成功了之后再继续往下执行,也就是把异步改成同步,可不可以实现呢?
求大神指导啊~
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>所有POI的查询-地址解析</title>
<script type="text/javascript" src="http://api.map.baidu.com/api?v=1.4"></script>
</head>
</html>
<script type="text/javascript">
var mOption = {
poiRadius : 500,
numPois : 12
}
var oFso1,input,input2;
oFso1 = new ActiveXObject("Scripting.FileSystemObject");
input = oFso1.OpenTextFile("c:\\test2.txt",1); //数据来源

while (!input.AtEndOfStream)
{
var sContent = input.ReadLine();
var text=sContent.split(" ");

var mPoint = new BMap.Point(parseFloat(text[2]), parseFloat(text[1]));
var myGeo = new BMap.Geocoder(); //创建地址解析实例

(function(geo,point,option,s){
geo.getLocation
(
point,
function mCallback(rs)
{
var oFso,output;
oFso = new ActiveXObject("Scripting.FileSystemObject");
output = oFso.OpenTextFile("c:\\out.txt",8,true); //写方式打开
var allPois = rs.surroundingPois; //获取全部POI(该点半径为100米内有6个POI点)
var str="";
for(i=0;i<allPois.length;++i){
str += " " + allPois[i].tags;
}
output.Writeline(s + str);
output.Writeline(s);
output.Close();
},
option
);
})(myGeo,mPoint,mOption,sContent);
}
input.Close();

alert("done");
</script>
...全文
1280 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
liusaint1992 2016-06-30
  • 打赏
  • 举报
回复
百度地图API五:大批量多次坐标转换结果返回顺序问题 http://blog.csdn.net/liusaint1992/article/details/51790777 利用的闭包,在回调函数中读取ajax请求次序。从而知道返回的结果是第几批坐标的请求。 然后就可以知道是哪几个点的结果。
student无涯 2014-10-23
  • 打赏
  • 举报
回复
我也碰到相同的问题,求解答,我是在调用公交换乘信息,通过数组传入的起始点和终止点,输出的结果顺序一直发生改变 var startArray=new Array(); var endArray=new Array(); //写入文档 var oFso,oFile,sFile,sContent; sFile = "C:\\Users\\studentdsx\\Desktop\\百度API\\strategy.txt"; oFso = new ActiveXObject("Scripting.FileSystemObject"); //最短时间花费 function calculate1() { var num=0; var transit1= new BMap.TransitRoute(map, { renderOptions: {map: map} }); transit1.setPolicy( BMAP_TRANSIT_POLICY_LEAST_TIME); var sumtime1; var walkDistance1=0; var lineDistance1=0; var changetime1=0; transit1.setSearchCompleteCallback(function(results){ var m=0; var firstPlan = results.getPlan(0); var mintime=firstPlan.getDuration(false); //找到行程时间最短的方案 for (var i = 0; i < results.getNumPlans(); i++) { if(results.getPlan(i).getDuration(false)<mintime) { mintime=results.getPlan(i).getDuration(false); m=i; } } sumtime1=mintime; var bestPlan=results.getPlan(m); for (var i = 0; i < bestPlan.getNumLines(); i++) { var line = bestPlan.getLine(i); lineDistance1+=line.getDistance(false); } for (var i = 0; i < bestPlan.getNumRoutes(); i++) { var walk = bestPlan.getRoute(i); walkDistance1+=walk.getDistance(false); } changetime1=bestPlan.getNumLines()-1; var s = []; s.push(num.toString()+" "+sumtime1+" "+walkDistance1+" "+lineDistance1+" "+changetime1); oFile = oFso.OpenTextFile(sFile,8,true); //写方式打开 oFile.WriteLine(s); oFile.close(); }); for(var num=0;num<startArray.length;num++) { transit1.search(startArray[num], endArray[num]); } }
download0322 2014-07-18
  • 打赏
  • 举报
回复
引用 1 楼 showbo 的回复:
解析都是异步的,无法同步 可以一个点一个点进行提交,一个点获取完后再发送下一个点进行解析 一次性发送2w个点都是异步请求无法控制哪个先返回 先读到数组中,在发送
   var mOption = {
        poiRadius: 500,
        numPois: 12
    }
    var oFso1, input, input2;
    oFso1 = new ActiveXObject("Scripting.FileSystemObject");
    input = oFso1.OpenTextFile("c:\\test2.txt", 1);  //数据来源
    var arr = [];
    while (!input.AtEndOfStream) {
        var sContent = input.ReadLine();
        arr[arr.length] = sContent;////////存数组中
       
    }
    input.Close();


    var l = arr.length, now = 0;
    function ParseAddr() {
        var text = arr[now].split(" ");
        var mPoint = new BMap.Point(parseFloat(text[2]), parseFloat(text[1]));
        var myGeo = new BMap.Geocoder();        //创建地址解析实例

        (function (geo, point, option, s) {
            geo.getLocation
        (
            point,
            function mCallback(rs) {
                var oFso, output;
                oFso = new ActiveXObject("Scripting.FileSystemObject");
                output = oFso.OpenTextFile("c:\\out.txt", 8, true); //写方式打开         
                var allPois = rs.surroundingPois;       //获取全部POI(该点半径为100米内有6个POI点)
                var str = "";
                for (i = 0; i < allPois.length; ++i) {
                    str += " " + allPois[i].tags;
                }
                output.Writeline(s + str);
                output.Writeline(s);
                output.Close();


                now++;
                if (now < l) ParseAddr();///没有解析完继续解析
            },
            option
        );
        })(myGeo, mPoint, mOption, sContent);
    }

    ParseAddr();
不过有个问题。。要是百度出问题或者网络又问题导致不执行mCallback回调,会无法继续进行解析操作
非常感谢!现在有个问题,有的时候回调函数卡住不往下执行了怎么办呢?
  • 打赏
  • 举报
回复
解析都是异步的,无法同步 可以一个点一个点进行提交,一个点获取完后再发送下一个点进行解析 一次性发送2w个点都是异步请求无法控制哪个先返回 先读到数组中,在发送
   var mOption = {
        poiRadius: 500,
        numPois: 12
    }
    var oFso1, input, input2;
    oFso1 = new ActiveXObject("Scripting.FileSystemObject");
    input = oFso1.OpenTextFile("c:\\test2.txt", 1);  //数据来源
    var arr = [];
    while (!input.AtEndOfStream) {
        var sContent = input.ReadLine();
        arr[arr.length] = sContent;////////存数组中
       
    }
    input.Close();


    var l = arr.length, now = 0;
    function ParseAddr() {
        var text = arr[now].split(" ");
        var mPoint = new BMap.Point(parseFloat(text[2]), parseFloat(text[1]));
        var myGeo = new BMap.Geocoder();        //创建地址解析实例

        (function (geo, point, option, s) {
            geo.getLocation
        (
            point,
            function mCallback(rs) {
                var oFso, output;
                oFso = new ActiveXObject("Scripting.FileSystemObject");
                output = oFso.OpenTextFile("c:\\out.txt", 8, true); //写方式打开         
                var allPois = rs.surroundingPois;       //获取全部POI(该点半径为100米内有6个POI点)
                var str = "";
                for (i = 0; i < allPois.length; ++i) {
                    str += " " + allPois[i].tags;
                }
                output.Writeline(s + str);
                output.Writeline(s);
                output.Close();


                now++;
                if (now < l) ParseAddr();///没有解析完继续解析
            },
            option
        );
        })(myGeo, mPoint, mOption, sContent);
    }

    ParseAddr();
不过有个问题。。要是百度出问题或者网络又问题导致不执行mCallback回调,会无法继续进行解析操作

87,997

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧