背景
面试题:后台传给前端十万条数据,你作为前端如何渲染到页面上?
回答者A:我有句话不知当讲不当讲,这什么鬼需求。
回答者B:滚,后端,我不要这样的数据,你就不能分页给我吗。
回答C:10万条数据这怎么展示,展示了也看不完啊。
分析:
面试官既然能这么问,我们从技术的角度出发,探索一下这道题,上手操作了一下:
function loadAll(response) {
var html = "";
for (var i = 0; i < 100000; i++) {
html += "<li>title:" + '我正在测试'+[i] + "</li>";
}
$("#content").html(html);
}
在chorme浏览器下面 非常卡顿,刷新页面数据非常卡顿,渲染页面大概花掉10秒左右的时间,卡顿非常明显,性能瓶颈是在将html字符串插入到文档中这个过程上, 也就是性能瓶颈是在将html字符串插入到文档中这个过程上,也就是 $("#content").html(html);
这句代码的执行, 毕竟有10万个li元素要被挺入到文档里面, 页面渲染速度缓慢也在情理之中。
解决方案
既然一次渲染10万条数据会造成页面加载速度缓慢,那么我们可以不要一次性渲染这么多数据,而是分批次渲染, 比如一次10000条,分10次来完成, 这样或许会对页面的渲染速度有提升。 然而,如果这13次操作在同一个代码执行流程中运行,那似乎不但无法解决糟糕的页面卡顿问题,反而会将代码复杂化。 类似的问题在其它语言最佳的解决方案是使用多线程,JavaScript虽然没有多线程,但是setTimeout和setInterval两个函数却能起到和多线程差不多的效果。 因此,要解决这个问题, 其中的setTimeout便可以大显身手。 setTimeout函数的功能可以看作是在指定时间之后启动一个新的线程来完成任务。
ajax 请求。。。。
function loadAll(response) {
//将10万条数据分组, 每组500条,一共200组
var groups = group(response);
for (var i = 0; i < groups.length; i++) {
//闭包, 保持i值的正确性
window.setTimeout(function () {
var group = groups[i];
var index = i + 1;
return function () {
//分批渲染
loadPart( group, index );
}
}(), 1);
}
}
//数据分组函数(每组500条)
function group(data) {
var result = [];
var groupItem;
for (var i = 0; i < data.length; i++) {
if (i % 500 == 0) {
groupItem != null && result.push(groupItem);
groupItem = [];
}
groupItem.push(data[i]);
}
result.push(groupItem);
return result;
}
var currIndex = 0;
//加载某一批数据的函数
function loadPart( group, index ) {
var html = "";
for (var i = 0; i < group.length; i++) {
var item = group[i];
html += "<li>title:" + item.title + index + " content:" + item.content + index + "</li>";
}
//保证顺序不错乱
while (index - currIndex == 1) {
$("#content").append(html);
currIndex = index;
}
}
思考:
面试官为啥会问这样的问题呢?现实中会有这样的需求吗? 我们从技术的角度思考,其实就是考察setTimetout的知识点。面试官就是换汤不换药。当然,其实这道题还有其他的解决方案,可以在评论区讨论学习。
小编本着雷锋精神在此分享一份36W字的面试宝典,内容涵盖:基础&进阶篇字符串&集合面试题汇总、.Java并发编程、JVM、数据结构与算法、网络协议、数据库、MySQL、52条SQL性能优化策略、一千行SQL命令、Redis、MongoDB、Spring(共485页,36W字)
Java基础篇
字符串&&集合篇
如果你觉得这些内容对你有帮助,可以加入csdn进阶交流群:714827309,领取资料
并发编程
JVM
数据结构与算法
网络协议
如果你觉得这些内容对你有帮助,可以加入csdn进阶交流群:714827309,领取资料
MySQL
Redis
Mongo
Spring
MyBatis
SpringBoot
常用注解
由于内容过多就不一一展示了,面试宝典内容还涵盖了:MyBatis、SpringBoot、Spring & SpringBoot常用注解、微服务、Dubbo、Nginx、Zookeeper、MQ、kafka、Elasticsearch、Linux面试专题。
如果你觉得这些内容对你有帮助,可以加入csdn进阶交流群:714827309,领取资料
近日,经过一朋友的透露,Alibaba也首发了一份限量的“Java成长手册”,里面记载的知识点非常齐全,看完之后才知道,差距真的不止一点点!
手册主要是将Java程序员按照年限来进行分层,清晰的标注着Java程序员应该按照怎样的路线来提升自己,需要去学习哪些技术点。
0-1年入门:
- Java基础复盘 (面向对象+Java的超类+Java的反射机制+异常处理+集合+泛型+基础IO操作+多线程+网络编程+JDK新特性)
- Web编程初探 (Servlet+MySQL数据库+商品管理系统实战)
- SSM从入门到精通 (Spring+SpringMVC+Mybatis+商品管理系统实战-SSM版)
- SpringBoot快速上手 (SpringBoot+基于SpringBoot的商品管理系统实战)
- 零距离互联网项目实战 (Linux+Redis+双十一秒杀实战系统)
1-3年高工:
- 并发编程进阶 (并发工具类实战+CAS+显示锁解析+线程池内部机制+性能优化)
- JVM深度剖析 (理解运行时数据区+堆外内存解读+JDK+内存泄漏问题排查+Arthas+GC算法和垃圾回收器+类加载机制)
- MySQL深度进阶
- 深入Tomcat底层 (线程模型+性能调优)
3-5年资深:
- 数据库(调优+事务+锁+集群+主从+缓存等)
- Linux(命令+生产环境+日志等)
- 中间件&分布式 (dubbo+MQ/kafka、ElasticSearch、SpringCloud等组件)
5-7年架构:
- 开源框架 (Spring5源码+SpringMVC源码+Mybatis源码)
- 分布式架构 (Zk实战+RabbitMQ+RocketMQ+Kafka)
- 高效存储 (Redis+mongoDB+MySQL高可用+Mycat+Sharing-Sphere)
- 微服务架构(RPC+SpringBoot+SpringCloud+Netflix+SpringCloudAlibaba+docker+k8s)
注:含答案 ! 篇幅有限,已整理到网盘 ,添加助理微信,免费获取。
如果你觉得这些内容对你有帮助,可以加入csdn进阶交流群:714827309,领取资料
基础篇
JVM 篇
由于篇幅限制,详解资料太全面,细节内容太多,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!
如果你觉得这些内容对你有帮助,可以加入csdn进阶交流群:714827309,领取资料
MySQL 篇
Redis 篇
由于篇幅限制,详解资料太全面,细节内容太多,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!
如果你觉得这些内容对你有帮助,可以加入csdn进阶交流群:714827309,领取资料