1 回答

TA貢獻(xiàn)1839條經(jīng)驗(yàn) 獲得超15個(gè)贊
您無法控制哪個(gè)數(shù)據(jù)塊首先到達(dá)服務(wù)器。如果途中某個(gè)地方出現(xiàn)網(wǎng)絡(luò)問題,它可能會(huì)繞地球多次才能到達(dá)服務(wù)器。
即使第一個(gè)塊早于第二個(gè)塊發(fā)送5 ms,第二個(gè)塊也可能會(huì)更早到達(dá)服務(wù)器。
但有幾種方法可以解決這個(gè)問題:
方法一:
在發(fā)送下一個(gè)塊之前等待服務(wù)器響應(yīng):
let state = {
isPaused: false
}
let sentChunks = 0
let totalChunks = getTotalChunksAmount()
let chunkToSend = ...
setInterval(() => {
if (!isPaused && sentChunks < totalChunks) {
state.isPaused = true
send(chunkToSend)
sentChunks += 1
}
}, 100)
onServerReachListener(response => {
if (response === ...) {
state.isPaused = false
}
})
方法二:
如果你不需要實(shí)時(shí)順序處理塊,你可以等待它們?nèi)康竭_(dá)服務(wù)器,然后在處理之前對它們進(jìn)行排序:
let chunks = []
onChunkReceived (chunk) {
if (chunk.isLast) {
chunks.push(chunk)
chunks.sort()
processChunks()
}
else {
chunks.push(chunk)
}
}
方法三:
如果您確實(shí)需要實(shí)時(shí)按順序處理塊,請為所有塊指定 id 屬性并按順序處理它們,同時(shí)存儲(chǔ)其他塊供以后使用:
let chunksToProcess = []
let lastProcessedChunkId = -1
onChunkReceived (chunk) {
if (chunk.id === lastProcessedChunkId) {
processChunk()
lastProcessedChunkId += 1
processStoredChunks()
}
else {
chunksToProcess.push(chunk)
}
}
添加回答
舉報(bào)