永遠に待機し続けるような気がするのですが、
ご認識の通りです。Promiseは resolve
もしくは reject
が呼ばれるまでずっと待機します。ダイアログを開いては閉じることを繰り返すと、 await
の箇所で止まったまま永遠に待ち続ける Promise がどんどん溜まっていきます1。問題があるかないかで言うと特にないでしょう(めちゃくちゃたくさん繰り返すとリソースが足りなくなったりはするかもしれません1)。
このことをはっきりさせるため、 showOpenFileDialog()
を次のように書き換えてみます。
const showOpenFileDialog = () => {
return new Promise((resolve, reject) => { // rejectも追加
const input = document.createElement('input');
input.type = 'file';
input.accept = '.txt, text/plain';
input.onchange = event => { resolve(event.target.files[0]); };
input.click();
setTimeout(() => { reject("timeout!"); }, 5000); // 5秒後にrejectする
});
};
5秒以内にファイルを選択すれば変更前と同じ処理が実行されます。先に resolve
が実行された時点で Promise は終了してしまうため、後から reject
が呼ばれても何も起きません。
一方5秒を過ぎてしまうと reject
が実行され、呼び出し元でエラーが発生します(これは try-catch
で捕まえることができます)。この場合もここで Promise は終了してしまうため、後から resolve
が呼ばれても何も起きません。
参考になりましたら幸いです。
-
参照元がなくなってしまうので内部的に破棄されたりするかもしれません。ここは私の知識ではなんとも言えません。 ↩