TypedArrayで非同期的にデータの切り貼り(splice等)をしたい

もちろん、ガシガシ同期的にspliceを実装することもできるでしょう。ただ、この方法だと小さなデータなら良いでしょうが、巨大なデータをspliceする時には、長時間のブロッキングが起きてしまうので、望ましくありません。

そういう時は、非同期的にspliceと同等の処理を実装する方法があります。
1. subarrayで切り出し
2. Blobのコンストラクタでつなげて
3. readAsArrayBufferで新しいArrayBufferにデータをコピーします。
いずれの処理でも、同期的データのコピーは行われていないため、大きなデータでも問題なく動作します。

今回は、Array.prototype.spliceをエミュレートしましたが、Blob + readAsArrayBufferの応用範囲は広く、実際には、この方法を応用して、もっと自由な形で、TypeArrayを切り貼りする機会の方が多いかもしれません。TypedArrayの練習問題的な意味で・・・。

// eslint-disable-next-line max-params
const spliceTypedArray = (array, startIndex, count, ...insertion) => {
  const blob = new Blob([
    array.subarray(0, startIndex),
    new array.constructor(insertion),
    count != null ? array.subarray(startIndex + count) : null,
  ]);
  return new Promise((resolve, reject) => {
    const reader = new FileReader();
    reader.onload = eve => {
      resolve(new array.constructor(reader.result));
    };
    reader.onerror = eve => {
      reject(reader.error);
    };
    reader.readAsArrayBuffer(blob);
  });
};
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.