前端需要載入一些分包的資料,最終拼成乙個完整資料報時,需要考慮回包的順序以及最後乙個回包收到的事件通知。最容易想到的方式是先分配好每個資料報的位置,每次收到資料報時,檢查資料報快取是否排滿,如果排滿就使用發布訂閱模式通知事件。
直接切入正題,走過了幾條彎路以後才發現promise.all方法才是最合適的解決方式。
//單執行緒
async
function
mainload()
) modelobj.vertex =
await promise.
all(arr)
}
沒錯,就是這麼簡單,promise.all會根據arr引數裡promise物件的順序去返回相同順序的資料報。有類似需求的同學們,請認準promise.all。
如果使用多執行緒分包載入資料會不會快呢?
h5標準的worker執行緒也出來很多年了,如果只是純前端開發,基本用不到。寫個東西試試,用資料說話。
//多執行緒
async
function
workerload()
) modelobj.vertex =
await promise.
all(arr)
}// 生成多執行緒
function
spawnworker
(i))
worker.
postmessage
(modelobj.baginfo.body[i]
) worker.
onmessage
=function
(event)})
}
worker.js裡的**就是個ajax請求分包資料,收到後通知主線程,注意worker執行緒有一些內建物件是獲取不到的,所以它能幹的事情有限。
分5個資料報載入,分大包和小包,下面是各類情況下的結果。
多執行緒載入大包或小包都要更慢???
看看下面的wate***ll圖就知道了,多執行緒還要多呼叫5個worker去生成ajax請求,執行緒之間還要有開銷,所以肯定就慢了。
觀察每乙個請求傳送的時間,單執行緒因為非同步的關係,與多執行緒一樣,幾乎都是同時傳送的。
查詢有關瀏覽器事件迴圈模型相關資料,ajax請求本來就是啟用其他執行緒去完成的,所以用worker純屬多此一舉。
難道worker執行緒在前端就是雞肋麼?
當然不是,在webgl領域以及前端人工智慧領域,把一些大計算量的工作放在worker去處理才能充分利用多核cpu,做做頁面的話好像確實用不到。
promise處理多個相互依賴的非同步請求
在專案中,經常會遇到多個相互依賴的非同步請求。如有a,b,c三個ajax請求,b需要依賴a返回的資料,c又需要a和b請求返回的資料。如果採用請求巢狀請求的方式自然是不可取的。導致 難以維護,如何請求很多。會出現很多問題。promise就是解決多個非同步請求的問題。promise是es6提供的乙個物件...
伺服器渲染中的非同步資料載入
static 是元件類的靜態方法的集合,能在元件建立前後呼叫,屬於元件類成員 注意 1 在靜態方法中不能訪問例項成分 props,state等 若要訪問,則要將例項成員以引數的形式傳入靜態方法中 2 定義在元件類中 呼叫 元件外 元件類.靜態方法 元件內 有兩種方式,一是元件類.靜態方法 二是thi...
關於非同步載入資料的又一種實現
package com.testasyntextview 把獲取的執行緒寫到方法中 比較好 import android.content.context import android.os.bundle import android.os.handler import android.os.mess...