◆ JavaScript にデストラクタはない
◆ ブラウザだと困らないけど Node.js でクローズ必要なものを使うと欲しくなる
◆ C# を参考に dispose メソッドを用意して using で使うようにしてみた
  ◆ コールバック関数で close 必要なものを操作する処理を渡す
  ◆ コールバック関数の実行後に自動で閉じる

ブラウザ JavaScript だと気になったことがないのですが Node.js だと時々デストラクタが欲しくなります

DB への接続やウェブサーバなど閉じないと Node.js プログラム自体が終わらないものがあります
その場で一時的に使うだけでならともかく どこかのプロパティにずっと残しておくものなどは閉じるのがやりづらいです
そういうときってもう参照は残ってなくてアクセスはできなくて GC されそうなのですが 勝手には閉じてくれないようで Node.js プログラムが終了しません
面倒なので process.exit を実行して止めてるのですが やっぱりちゃんと開いたものを閉じて自然と Node.js プログラムが終了するようにしたいです

コンストラクタで this のプロパティに open や connect したインスタンスを入れるケースが多いので デストラクタがあれば 使わなくなって GC されれば勝手に閉じれるのにな と思うのですが JavaScript にはないんですよね
まぁ もともとブラウザ側がメインな言語ですし ブラウザ側で欲しくなるケースなんてほぼないですから仕方ないかもしれませんけど

using

なにかいい方法がないかと考えていると C# だとデストラクタというより dispose を目にします
dispose の呼び忘れのためにデストラクタでも dispose を呼び出してたりしますが デストラクタの呼び出しタイミングの問題とかで IDisposable と using を使うことがほとんどかと思います

JavaScript でも using 的なものを作って 使うときは絶対 using するようにすれば 少しは楽になりそうです

using(new Class(), instance => {
instance.xxx()
})

こういう感じで書くようにします
その関数スコープで終わらずプロパティに保持するような場合は そのオブジェクトに閉じるための dispose メソッドを用意して using の引数に渡します

でもやっぱり そのオブジェクトをあちこちに渡したり 非同期の処理があったりでうまくいかなそうな気もします

上のコードで動かすための例はこんなのです

class Class {
dispose() {
console.log("dispose called")
}
xxx() {
console.log("xxx")
}
}

async function using(instance, fn) {
const result = await fn(instance)
typeof instance.dispose === "function" && instance.dispose()
return result
}
xxx
dispose called

書いてみると 前にもこんな感じのことブログに書いたような気がするのですが 探しても見当たらなかったです
結局記事にしなかったのかな



==追記==

もう少し探していると ありました
dispose ってワードを使ってなかったので検索には引っかからなかったみたいです

using でスコープを作る