usingはletやconstとおなじ変数宣言のキーワード

usingって何?

  • 後片付けしてくれるconst
    • 変数宣言(letとかconstとおなじ感じ)
    • 使い終わったら自動的にリソース解放してくれる

予備情報

いつ使うん?

usingの対象になるもの

  • 使用後に解放処理が必要なもの
    • メモリリーク、ファイル肥大化、デッドロック
    • ファイルハンドル、DB接続、タイマー
  • try...finallyで書いていたもの
    • 後片付け系のコードを見つけたらusingに置き換えられる候補

実際に動くコードで確認

class Resource {
  constructor(name) {
    this.name = name;
    console.log(`[open] ${this.name}`);
  }
  // 確認用 ⭐ブロックを抜ける時にこのメソッドを自動的に呼び出してくれる
  [Symbol.dispose]() {
    console.log(`[close] ${this.name}`);
  }
}

function main() {
  using r1 = new Resource("DB接続");
  using r2 = new Resource("ファイルハンドル");
  console.log("処理を実行中");
}

main();

// [open] DB接続
// [open] ファイルハンドル
// 処理を実行中
// [close] ファイルハンドル
// [close] DB接続

上記のコードの処理の流れ

  1. main()実行
  2. r1生成 → [open] DB接続
  3. r2生成 → [open] ファイルハンドル
  4. console.log("処理を実行中")が実行
  5. main()関数ブロックを抜ける
    • usingで宣言された編集の[Symbol.dispose()]が宣言時と逆順で自動的に呼ばれる
      • r2閉じられる [close] ファイルハンドル
      • r1閉じられる [close] DB接続

リソースを解放するために、オブジェクトの [Symbol.dispose]() メソッドが呼び出されます。

MDN

usingをfor…ofで使用する

ループが1周するたびにリソースを解放してくれる

using – JavaScript | MDN

for (using x of array)

使い所

大量のリソースを1個ずつ順番に処理して、使用後すぐに解放したい

for (using file of openManyFiles(fileList)) {
    processFile(file);
} // ファイルを1個処理し終わるたびに自動的に閉じる
  // 全部開いてるとメモリを圧迫する

最後に

便利そう。await usingもあるらしい。便利そう。