场景:读取Excel数据(地名),发送请求到百度地图,从返回的json格式数据取出坐标数据(逗号隔开的两个float型数值),拼接成了分号隔开的一个字符串data,接下来需要利用“百度坐标转换API”,将这些坐标值循环发送过去来转换,

现在遇到的问题是:
1、这个请求是异步的,意味着,后面的请求并不会等他前面的请求返回结果才行动,这就好比,火车站排队购票,大家都抢,后面的人不等他前面的人拿到票就把他挤走了,结果是什么呢,好了,你被挤走了,售票美女给你打印票的速度太慢了,递出的票被后面的人拿到了。真实情况是什么样的呢?如果数据只有几千条,基本上for循环已经结束了,数据还没有拿回来,于是我还没拿到票,我后面第10个人甚至第100个人刚好挤到窗口伸手拿票,结果就是返回的数据跟请求根本对不上号,全部错乱了。

解决方法:首先定义一些全局的变量
var pointsArr = [];  //(全局的都用红的),data转换成的数组
var len = 0;           //pointsArr 的长度
var num = 0;        //每发送一次num+1
var datalist = "" ;  //请求回来的数据丢进这个里面

用data2Array方法得到pointsArr 忽略过程

data2Array: function(data){
var dataArr = data.split(";"); 
var dataArrlen = dataArr.length;
for(var i=0;i<dataArrlen;i++){
pointsArr[i] = new BMap.Point(dataArr[i].split(",")[0],dataArr[i].split(",")[1]);//这是你要循环发送的数据
}
len = pointsArr.length;
bdswich();//开始调用百度api的方法
}
//转换
 bdswich: function(){
var convertor = new BMap.Convertor();
convertor.translate([pointsArr[num]], 1, 5, translateCallback);//百度转换方法, translateCallback是回调函数,自动调用
num++;//每发送一次num+1,和for循环类似
    }
//回调函数
translateCallback:function (result){
var lng = 0;
var lat = 0;                 
if(result.status === 0){
 lng = result.points[0].lng;
             lat = result.points[0].lat;  
 }
 datalist=datalist+"{"+'"lng":'+lng+','+'"lat":'+lat+"},";
 setTimeout(control(), 1000); //上面的忽略,这个是关键,定时器,1秒后执行control()函数      
}
//控制函数
control: function(){
        if(num<len){
   bdswich();//只要num没到len,回到开头,循环执行转换函数
        }else{
   dosomething!!!!!//num自增到len,循环结束 
}
}

下面简要的说几个要点:
这个方法的核心是,用数组+定时器代替for循环 
首先num=0,发送第一个数据 pointsArr[0],执行完后一定记得num++,
然后在回调函数translateCallback中,定时1秒后执行控制函数control(),即

setTimeout(control(), 1000);
在control()中,判断num和len,没取完值,返回去继续执行转换函数bdswich()
下一轮请求发送继续开始

一般情况下,1000毫秒足够一次请求返回了,但是呢,for循环有多快呢,可以自己测试下

第三篇:异步请求遇上for循环怎么做的更多相关文章

  1. .Net MVC5异步请求Entity Framework 无限循环解决方法

    .Net MVC5异步请求Entity Framework 无限循环解决方法 Entity Framework 存在一对多.多对多之间的关系,相互依赖,在返回JSON数据时往往会出现相互引用造成的无限 ...

  2. ASIHTTP 框架,同步、 异步请求、 上传 、 下载

    ASIHTTPRequest详解 ASIHTTPRequest 是一款极其强劲的 HTTP 访问开源项目.让简单的 API 完成复杂的功能,如:异步请求,队列请求,GZIP 压缩,缓存,断点续传,进度 ...

  3. WEB安全第三篇--控制请求的艺术:CSRF和SSRF

    零.前言 最近做专心web安全有一段时间了,但是目测后面的活会有些复杂,涉及到更多的中间件.底层安全.漏洞研究与安全建设等越来越复杂的东东,所以在这里想写一个系列关于web安全基础以及一些讨巧的pay ...

  4. SpringBoot中异步请求和异步调用(看这一篇就够了)

    原创不易,如需转载,请注明出处https://www.cnblogs.com/baixianlong/p/10661591.html,否则将追究法律责任!!! 一.SpringBoot中异步请求的使用 ...

  5. maven工程 java 实现文件上传 SSM ajax异步请求上传

    java ssm框架实现文件上传 实现:单文件上传.多文件上传(单选和多选),并且用 ajax 异步刷新,在当前界面显示上传的文件 首先springmvc的配置文件要配置上传文件解析器: <!- ...

  6. 【读书笔记】iOS网络-同步请求,队列式异步请求,异步请求的区别

    一,同步请求的最佳实践. 1,只在后台过程中使用同步请求,除非确定访问的是本地文件资源,否则请不要在主线程上使用. 2,只有在知道返回的数据不会超出应用的内存时才使用同步请求.记住,整个响应体都会位于 ...

  7. 【读书笔记】iOS-网络-同步请求,队列式异步请求,异步请求的区别

    一,同步请求的最佳实践. 1,只在后台过程中使用同步请求,除非确定访问的是本地文件资源,否则请不要在主线程上使用. 2,只有在知道返回的数据不会超出应用的内存时才使用同步请求.记住,整个响应体都会位于 ...

  8. Spring Boot 异步请求和异步调用,一文搞定

    一.Spring Boot中异步请求的使用 1.异步请求与同步请求 特点: 可以先释放容器分配给请求的线程与相关资源,减轻系统负担,释放了容器所分配线程的请求,其响应将被延后,可以在耗时处理完成(例如 ...

  9. Servlet 3.0 规范(二)注解驱动和异步请求

    Servlet 3.0 规范(二)注解驱动和异步请求 在 Servlet 3.0 时支持注解启动,不再需要 web.xml 配制文件. 一.Servlet 3.0 组件 Servlet 容器的组件大致 ...

随机推荐

  1. jq-demo-2种吸顶效果

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  2. 字符串dp——牛客多校第五场G

    比赛的时候脑瘫了没想出来..打多校以来最自闭的一场 显然从s中选择大于m个数组成的数必然比t大,所以只要dp求出从s中选择m个数大于t的方案数 官方题解是反着往前推,想了下反着推的确简单,因为高位的数 ...

  3. Python 爬取赶集网租房信息

    代码已久,有可能需要调整 #coding:utf-8 from bs4 import BeautifulSoup #有这个bs4不用正则也可以定位要爬取的内容了 from urlparse impor ...

  4. PMP-49个过程快速导览

    启动过程组 名正言顺 人鬼佛神 01 -4.1制定项目章程 -授权PM,启动项目 ● 编写一份正式批准项目并授权项目经理在项目活动中使用组织资源的文件的过程 ● 明确项目与组织战略目标之间的联系,确立 ...

  5. VS2010-MFC(Ribbon界面开发:为Ribbon Bar添加控件)

    转自:http://www.jizhuomi.com/software/253.html 前面一节为大家简单介绍了如何创建Ribbon样式的应用程序框架,本节教程就来初步讲讲怎样为Ribbon Bar ...

  6. idea 设置默认maven auto import,不需要每次都弹出

    1 2 误区 从这里点进去进行设置,或者每次打开项目右击下方的 auto impot都是不对的.

  7. CodeForces 1166C A Tale of Two Lands

    题目链接:http://codeforces.com/problemset/problem/1166/C 题目大意 给定 n 个数,任选其中两个数 x,y,使得区间 [min(|x - y|, |x ...

  8. JavaScript网页特效5则

    动态字幕 代码:在需要处加入 < marquee onmouseover=this.stop() onmouseout=this.start()>欢迎访问JavaScript教程网 特点: ...

  9. 网络安全系列 之 TLS/SSL基本原理

    1. TLS/SSL基本工作方式: TLS/SSL的功能实现主要依赖于三类基本算法(参见"网络安全系列 之 密码算法"): 非对称加密算法:实现身份认证和密钥协商 对称加密算法: ...

  10. 《转》python(7)列表

    转自 http://www.cnblogs.com/BeginMan/p/3153842.html 一.序列类型操作符 1.切片[]和[:] 2.成员关系操作符(in ,not in ) 1: s1 ...