たまにしか使わない処理なので最初の使用時に初期化処理を行うようにしてるものです
イメージ
const execute = async (args) => {
if (!instance) {
await setupInstance()
}
return instance.run(args)
}
初期化処理に非同期処理が含まれるので初期化処理全体が非同期処理になっています
2 回目の呼び出しが 1 回目の直後だと インスタンスはあるものの初期化処理が完全に終わってないので instance.run の実行はできるのに何も行われないみたいな動きになってました
インスタンスの初期化が終わらないと 内部のリスナが設定されていなくてイベントを起こしても何も起きないという状況でした
ここが undefined のプロパティ参照や非関数の実行など実行時にエラーになってくれていれば簡単に原因がわかったのですけどね
インスタンス側に ready プロパティを用意して初期化後に解決する Promise を入れておくなどの対処が必要でした
const execute = async (args) => {
if (!instance) {
await setupInstance()
}
await instance.ready
return instance.run(args)
}
ただ この最初の呼び出しで初期化する方法だと instance.run が同期的なのに execute の処理が非同期処理になってしまうのですよね
setupInstance が同期処理だとそもそも発生しない問題ですし あちこちが非同期処理になると不便なところも多いです