WebRTC 経由でファイルを転送しようとしていますが、データが入ってきたときにデータを書き込むための適切なパターンを見つけるのに苦労しています。利用可能になったらチャンク。これは次の 2 つのことを意味します。
- データの受信速度が速すぎる場合は、現在の書き込みタスクが完了した後に書き込むために、各チャンクをキューに入れる必要があります
- データの受信が遅すぎる場合は、チャンクが利用可能になるまで待つ必要があります
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
、次のチャンクを書き込む準備ができておらず、例外がスローされることです。ただし、チャンクの受信が遅すぎると、正しいタイムアウトを設定するのが非常に難しくなります。
ここでは、イベント駆動型のアプローチが最適に機能するようです。1 つのイベントは、 から着信するデータ メッセージRTCDataChannel
です。もう 1 つのイベントは、fileWriter
書き込みが完了し、次のチャンクを書き込む準備ができていることです。しかし、私が立ち往生している部分は、チャンクが入ってくるのを適切に待つ方法です...
ブラウザがファイルへの書き込みで忙しくなく、チャンクが入ってくるのを待っているだけの場合、ブラウザはチャンクが利用可能になり次第、チャンクの書き込みを開始する必要があります。setTimeout
しかし、いループなしでこれを行う方法がわかりません。もう待つ必要がなく、書き続けることができるというイベントを公開する方法がわかりません。
これを行うための良いパターンは何ですか?