1 回答
TA贡献1839条经验 获得超15个赞
您无法控制哪个数据块首先到达服务器。如果途中某个地方出现网络问题,它可能会绕地球多次才能到达服务器。
即使第一个块早于第二个块发送5 ms,第二个块也可能会更早到达服务器。
但有几种方法可以解决这个问题:
方法一:
在发送下一个块之前等待服务器响应:
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
}
})
方法二:
如果你不需要实时顺序处理块,你可以等待它们全部到达服务器,然后在处理之前对它们进行排序:
let chunks = []
onChunkReceived (chunk) {
if (chunk.isLast) {
chunks.push(chunk)
chunks.sort()
processChunks()
}
else {
chunks.push(chunk)
}
}
方法三:
如果您确实需要实时按顺序处理块,请为所有块指定 id 属性并按顺序处理它们,同时存储其他块供以后使用:
let chunksToProcess = []
let lastProcessedChunkId = -1
onChunkReceived (chunk) {
if (chunk.id === lastProcessedChunkId) {
processChunk()
lastProcessedChunkId += 1
processStoredChunks()
}
else {
chunksToProcess.push(chunk)
}
}
添加回答
举报