ajax一次輸出1萬條數據庫,后端接口一次給出100萬條數據,請問你前端怎么分頁處理...

面試官既然能這么問,我們從技術的角度出發,探索一下這道題,上手操作了一下:

function loadAll(response) {

var html = "";

for (var i = 0; i < 100000; i++) {

html += "

title:" + '我正在測試'+[i] + "";

}

$("#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 += "

title:" + item.title + index + " content:" + item.content + index + "";

}

//保證順序不錯亂

while (index - currIndex == 1) {

$("#content").append(html);

currIndex = index;

}

}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/538081.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/538081.shtml
英文地址,請注明出處:http://en.pswp.cn/news/538081.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

“” '' ``區別 初學者自用

單引號 相當于吧里面的內容直接輸出。并不會考慮里面是否有變量命令等雙引號 "" 只認變量 命令會直接輸出反引號 兩種都認 實例&#xff1a; a"hello" [localhost.localdomain 10:16:09]$echo echo %a輸出&#xff1a;echo %a [localhost.localdomain…

maven私有庫配置

不同的項目&#xff0c;不同的私有庫1、添加倉庫Release 發布&#xff1b; 發行倉庫snapshot 快照&#xff0c;開發&#xff0c;調試倉庫配置完成2、配置權限默認開通的權限&#xff0c;查看權限給剛才建的兩個私有庫添加權限配置好后3、創建角色&#xff0c;分配權限添加rolei…

asc desc排序_21.數據庫排序?左連接 ?右連接?

更多內容來源&#xff1a;http://mp.weixin.qq.com/mp/homepage?__bizMzA5OTQ1ODE1NQ&hid6&sn843337a7d9931839214ec8f861ac2164&scene18#wechat_redirect1、數據庫排序語法 select column_name,column_name from table_name order by column_name,column_name as…

京東ajax怎么用,使用Ajax、json實現京東購物車結算界面的數據交互實例

全選商品單價數量小計操作全選刪除選中產品總價&#xff1a;&#xffe5;0body,html,ul,li,a{margin:0;padding:0;font-family:"microsoft yahei";list-style:none;text-decoration:none;}.fl{float:left;}.fr{float:right;}.f12{font-size:12px;}.disl{display:inli…

Facebook 游戲開發更新文檔 API 參考文檔 v6.0

Facebook 游戲開發更新文檔 API 參考文檔 v6.0 更新日志 1.排行榜 此版本全新推出排行榜 API&#xff01;提供一套強大的 API&#xff0c; 使得游戲可獲取排行榜、查詢得分 情況和設置新分數&#xff08;支持分數所帶的 任意元數據&#xff09;&#xff0c;并可向 Messenger 對…

maven私有庫搭建

為什么要搭建maven私有庫&#xff1f; 有位博主在2008年時這樣寫道&#xff1a; 如果沒有私服&#xff0c;我們所需的所有構件都需要通過maven的中央倉庫和第三方的Maven倉庫下載到本地&#xff0c;而一個團隊中的所有人都重復的從maven倉庫下載構件無疑加大了倉庫的負載和浪費…

mysql查詢_MYSQL查詢

-- 單表查詢SELECT sc.*FROM scSELECT * FROM course-- 分頁 LIMIT 從0開始檢索SELECT * FROM course LIMIT 0,3SELECT * FROM course limit 3,3SELECT * FROM course LIMIT 6,1-- 多表連接查詢-- 1.等值與非等值連接查詢SELECT * FROM student;SELECT * FROM course;SELECT *…

微軟封閉服務器切換,執行服務器切換:Exchange 2013 幫助 | Microsoft Docs

執行服務器切換2021/6/1本文內容適用于&#xff1a;Exchange Server 2013 SP1服務器切換是一個任務&#xff0c;執行該任務以將當前郵箱服務器的所有活動郵箱數據庫副本移動到數據庫可用性組 (中的一個或多個其他郵箱) 。 此任務作為為當前郵箱服務器的計劃中斷做準備的一部分執…

eclipse maven訪問maven私有庫

1、Windows本地maven下載 https://maven.apache.org/download.cgi 2、maven setting 文件配置 進入maven 目錄下 conf。apache-maven-3.2.3\conf 新建.xml 文件&#xff0c;內容如下&#xff1a; <?xml version"1.0" encoding"UTF-8"?><set…

入門系列之在Ubuntu 16.04使用Buildbot建立持續集成系統

歡迎大家前往騰訊云社區&#xff0c;獲取更多騰訊海量技術實踐干貨哦~ 本文由angel_郁發表于云社區專欄 介紹 Buildbot是一個基于Python的持續集成系統&#xff0c;用于自動化軟件構建&#xff0c;測試和發布過程。 在本教程中&#xff0c;我們將演示如何設置持續集成系統以自動…

fedora mysql 初始化_Linux(fedora)下啟動MySQL,結果顯示:env: /etc/init.d/mysql:權限不夠。 我已經將權限切換到su了...

展開全部Linu下啟動MySQL結果顯示&#xff1a;env: /etc/init.d/mysql: 是腳e69da5e887aa62616964757a686964616f31333365646235本執行的問題解決辦法&#xff1a;依次執行下面的命令(執行失敗的話&#xff0c;檢查路徑是否正確)&#xff1a;cp /etc/init.d/mysql /etc/init.d/…

3.Android的新虛擬ART與原虛擬機DVM的區別

Android在4.2之前的虛擬機叫做 DVM 在4.2的時候多了一個虛擬機選擇&#xff0c;這是新的虛擬機 ART。Android Runingtime 那時ART還不夠成熟&#xff0c;需要測試&#xff0c;所以默認虛擬機是DVM。國內的ROM廠商直接把ART給割了。 Android5.0起&#xff0c;默認使用ART虛擬…

mysql binlog 統計_對MySQL binlog日志解析,統計每張表的DML次數

想要獲取每天數據庫每張表的DML的次數&#xff0c;統計熱度表&#xff0c;可以使用該腳本# coding:utf-8# 解析binlog&#xff0c;統計熱度表&#xff0c;表的DML個數import sysimport os# mysqlbinlog解析binlog日志def binlog_output():binlog_file sys.argv[1]file_num bi…

strapi 開源api 內容管理平臺試用

strapi 是一個開源的api && 內容管理平臺&#xff0c;功能操作起來還是比較方便簡單的。 安裝 使用docker && docker-compose 代碼clonegit clone https://github.com/strapi/strapi-docker && cd strapi-docker 啟動 docker-compose up -d 訪問 首次初…

1.android體系結構介紹

一、Android的介紹 android介紹見百度百科&#xff1a;Android的介紹&#xff0c;度娘把Android介紹的這么清楚&#xff0c;如果谷歌是Android的爹&#xff0c;那度娘就是娘了。 二、Android的架構圖 android系統主要分四層&#xff1a; 從上致下&#xff1a; 1、應用層 2、…

mysql seconds_behind_master_MySQL中的seconds_behind_master的理解

通過show slave status查看到的Seconds_Behind_Master&#xff0c;從字面上來看&#xff0c;他是slave落后master的秒數&#xff0c;一般情況下&#xff0c;也確實這樣&#xff0c;我們可以通過Seconds_Behind_Master數字查看slave是否落后于master&#xff0c;但是在一些環境中…

2.JVM和DVM之間的區別

1、JVM .java----->.class----->.jar 運行在內存的 棧 棧虛擬機 2、DVM .java----->.class------>.dex-----(加上其它資源文件)---->apk 運行在CPU的 寄存器 寄存器虛擬機 ---------------------------------------------------------- 3、DVM與JVM的區…

Node.js模塊以及模塊加載機制

2019獨角獸企業重金招聘Python工程師標準>>> Node.js中的模塊 在Node.js中&#xff0c;以模塊為單位劃分功能&#xff0c;通過一個完整的模塊加載機制使得開發人員可以將應用程序劃分為多個不同的部分。模塊的使用可以提高代碼重用率&#xff0c;提高應用程序的開發…

wordpress支持MySQL5.5_wordpress數據庫版本為5.5以上導出不能在5.5以下的版本導入的問題解決...

自從wordpress4.2版本出現以后&#xff0c;已經可以支持utf8mb4數據編碼&#xff0c;那么如果您的php空間的數據庫版本是mysql5.1的&#xff0c;那么很多站長朋友從mysql5.5導出來再導入到5.1的數據中的時候&#xff0c;那么問題來了&#xff0c;就會報錯Unknown collation ‘u…

i++與++i的區別

代碼&#xff1a; int i1; int ai;//先賦值&#xff0c;然后再自增&#xff0c;它等價于 a i ; i i 1System.out.println("a"a);System.out.println("i"i);System.out.println("---------------");int j1; int bj;//先自增&#xff0c;后賦值…