onLoad
系のイベントとPromise
は、相性が良いのではないかと思い始めました。
onLoad
系のイベントをそのまま使うと
onload
やDOMContentLoaded
を筆頭に、JavaScriptの世界には「ロード完了時に」何かを実行するようなイベントがあります。ただ、そのままイベントにセットしようとすると「すでに終了済みだった」というような事態が発生することがあります。
また、「複数の条件が満たされてから実行したい」ということがあるかもしれません。
Promise
化するメリット
このような状況にも、Promise
なら柔軟に対応できます。
- 遅れてのセット…
Promise#then
はresolve
前でもresolve
後でも問題なく動く -
Promise
はデフォルトで非同期実行 - 複数の条件…
Promise.all
で取れる
例えば、DOMContentLoaded
をPromise
化してみると、以下のようになります。
const promise = new Promise(resolve => {
const fire = () => {
resolve();
document.removeEventListener('DOMContentLoaded', fire, false);
};
document.addEventListener('DOMContentLoaded', fire, false);
});
このpromise
にthen
していけば、「まだDOMContentLoaded
していなければ、それまで待つ」「すでにDOMContentLoaded
していれば、その場で非同期実行」というような挙動となります。