我正在尝试通过 WebRTC 传输文件,并且我正在努力找出写入数据的良好模式。由于文件块将以未知的速度进入,我需要能够编写每个块可用时;这意味着两件事:
- 如果数据进来太快,那么我们需要在当前写入任务完成后将每个块排队等待稍后写入
- 如果数据进来太慢,那么我们需要等待一个块变得可用
理想情况下,我想避免不得不依赖setTimeout()
等待大块到达。到目前为止我所拥有的很接近,但并不完全是我想要的:
// container to hold chunks as they come in
var chunkCollection = {};
// callback function for RTCDataChannel messages
function onData(data) {
chunkCollection[data.chunkIndex] = data.chunk;
writeToFile(data.chunkIndex);
}
function writeToFile(chunkIndexToWrite) {
// if we have the next chunk, write it to the file
if (chunkCollection[chunkIndexToWrite]) {
var chunk = chunkCollection[chunkIndexToWrite];
delete chunkCollection[chunkIndexToWrite];
fileWriter.seek(chunk.offset);
fileWriter.write(chunk.blob);
}
else {
// we don't have the next chunk, so we have to wait
setTimeout(function() {
writeToFile(chunkIndexToWrite);
}, 100);
}
}
这样做的问题是,如果块进入得太快,fileWriter
将无法准备好写入下一个块并且会抛出异常。但是,如果块进入太慢,设置正确的超时将非常棘手。
似乎事件驱动的方法在这里效果最好。一个事件是来自 的数据消息RTCDataChannel
。另一个事件是fileWriter
已经完成写入,并准备写入下一个块。但我遇到的问题是如何正确地等待一大块进来......
如果浏览器不忙于写入文件,而只是等待块进入,则浏览器应该在块可用时立即开始写入块。setTimeout
但是如果没有丑陋的循环,我无法弄清楚如何做到这一点;我不知道如何发布一个表明我们不再需要等待并且可以继续写作的事件。
这样做的好模式是什么?