如何在js中提高性能

esunaly 2016-11-14 04:41:18
请教各路大神,我遇到一个问题,就是js中我们需要批量导入一批数据对这批数据进行操作。代码类似这样for(var i=0;i<10000;i++){......极其复杂耗时间的操作,并且不能异步,只能同步} 这样的话性能特别低,想请教各路大神如何解决。我利用settimeout实现了一个类似多线程的功能 delay:0 UpdatedRecords :需要处理的数据
function delayEachArray(delay,UpdatedRecords ,i) {
console.log(new Date().getTime()); //将延迟设为0s后,我以为在这打印的时间应该是相差不大的,但是发现相差的很大,基本上是等于数据处理过程完成后,才会打印下一个时间
if (i == undefined) i= 0;
record = UpdatedRecords[i];
var Record_Approval_result = record.data.approval_result;
if(Record_Approval_result != 'E'){
//此方法是对数据处理的过程。这个过程很费时间,并且是一个ajax的同步请求
ApprovalSubmit(record);
}
i++;
if (i < UpdatedRecords.length){
setTimeout(function () { delayEachArray(delay, UpdatedRecords,i); }, delay);
}
else {
return ;
}
}
不知道什么办法可以提高性能,因为那个处理过程极其耗费时间,并且需要处理的数据是大量的。望各路大神赐教
...全文
428 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
esunaly 2016-11-18
  • 打赏
  • 举报
回复
谢谢大家的帮助,我各种方法使尽,最后用最简单的方法解决了。就是想办法把所有的ajax同步,想办法弄成了异步。至于我说的那种下面的ajax请求拿不到上面ajax请求的返回结果。最终是利用回调解决的。只能是步步回调。虽然执行的过程还是顺序执行。但是可以使得批量数据进行异步操作。而不是一个等着另一个。初步测试。时间上大概提高了十倍左右。就这样吧
___紫菜 2016-11-15
  • 打赏
  • 举报
回复
撸这么多年的代码还真没见过这样的
Monxin商城系统 2016-11-15
  • 打赏
  • 举报
回复
谢谢分享学习了
木头海上漂 2016-11-15
  • 打赏
  • 举报
回复
异步是跳出当前的运行流程。。。。按你这样数据量大的话页面肯定会卡的。。。我看你还是尽量在页面设计上给个优化吧(多考虑下在这时候页面等待效果)。。。
esunaly 2016-11-15
  • 打赏
  • 举报
回复
[quote=引用 4 楼 jslang 的回复:] [quote=引用 2 楼 esunaly 的回复:] [quote=引用 1 楼 showbo 的回复:] .ajax({ url: "url1", success: function (data) { result1=data。。(处理data) $.ajax({ url: "url2", success: function (data) { $.ajax({ url: "url3", parame:{ username:result1.username// 异步请求,ajax2运行到这里,你的result1是没值的。。。。因为ajax1还没请求回来
esunaly 2016-11-15
  • 打赏
  • 举报
回复
[quote=引用 3 楼 jzshmyt 的回复:] 宝宝不想说。宝宝心里苦。。。。明明是个写后台的,现在硬生生的被项目组逼成前端了。。。。我们项目没有后台啊,不用任何后台框架,。。。。。不要问我数据怎么拿。我只想告诉你,我们用的extjs,都是js,ajax请求ktr文件,直连数据库,获取数据。。。不是我这么设计的。我就是个扫地的。我啥也不知道。。。。。。
hookee 2016-11-15
  • 打赏
  • 举报
回复
用 promise 呢?
未知数 2016-11-15
  • 打赏
  • 举报
回复
没兼容要求的话,用 generator 处理ajax异步逻辑吧,看起来结构清晰,和同步差不多,适合这种回调层次很多的情况 现chrome和firefox已支持generator generatorHandle(function *(){ var res1 = yield $.ajax({ url: '/test1.json' }); console.log(res1); var res2 = yield $.ajax({ url: '/test2.json', data: res1 }); console.log(res2); } function generatorHandle (generator){ var g = generator(); function ret(){ var r = g.next.apply(g, arguments); // 将入参(即上次ret时注册的回调函数获得的响应)通过next传递到generator内 if(!r.done) { // 当generator没有走完时,注册回调函数获得响应,继续递归调用ret var value = r.value; if(value.then) { // 如果value是promise的处理 value.then(function(){ ret.apply(null, arguments); }); } else { // value不是promise value(function(){ ret.apply(null, arguments); }) } } else { //console.log('所有异步完成,结果:'+r.value); } } ret(); }
天际的海浪 2016-11-14
  • 打赏
  • 举报
回复
引用 2 楼 esunaly 的回复:
[quote=引用 1 楼 showbo 的回复:] 因为我那个同步过程是这样的ajax1{ ajax2{ajax3}}就是好多个ajax嵌套在一起,并且ajax2需要用到ajax1的返回结果。ajax3用到ajax2的返回结果,依次类推。如果把其设为异步,那么就存在ajax2要使用ajax1返回的结果的时候,就会出现undefied现象
异步也可以嵌套

$.ajax({
	url: "url1",
	success: function (data) {
		$.ajax({
			url: "url2",
			success: function (data) {
				$.ajax({
					url: "url3",
					success: function (data) {

					}
				});
			}
		});
	}
});
jzshmyt 2016-11-14
  • 打赏
  • 举报
回复
为什么呀在for循环中 疯狂调ajax方法,感觉这种设计本省就不合理,如果有大量处理任务,就应该在后台编写并行处理程序,多线程处理
esunaly 2016-11-14
  • 打赏
  • 举报
回复
[quote=引用 1 楼 showbo 的回复:] 因为我那个同步过程是这样的ajax1{ ajax2{ajax3}}就是好多个ajax嵌套在一起,并且ajax2需要用到ajax1的返回结果。ajax3用到ajax2的返回结果,依次类推。如果把其设为异步,那么就存在ajax2要使用ajax1返回的结果的时候,就会出现undefied现象
Go 旅城通票 2016-11-14
  • 打赏
  • 举报
回复
你同步肯定卡了,特别网络差的时候 自己改ajax的逻辑,改为异步的,同步的话用setTimeout也没用,UI会假死。所有同步请求都可以改为异步的,自己慢慢琢磨怎么改

87,922

社区成员

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

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