onLoad系のイベントとPromiseは、相性が良いのではないかと思い始めました。

onLoad系のイベントをそのまま使うと

onloadDOMContentLoadedを筆頭に、JavaScriptの世界には「ロード完了時に」何かを実行するようなイベントがあります。ただ、そのままイベントにセットしようとすると「すでに終了済みだった」というような事態が発生することがあります。

また、「複数の条件が満たされてから実行したい」ということがあるかもしれません。

Promise化するメリット

このような状況にも、Promiseなら柔軟に対応できます。

  • 遅れてのセット…Promise#thenresolve前でもresolve後でも問題なく動く
  • Promiseはデフォルトで非同期実行
  • 複数の条件…Promise.allで取れる

例えば、DOMContentLoadedPromise化してみると、以下のようになります。

const promise = new Promise(resolve => {
  const fire = () => {
    resolve();
    document.removeEventListener('DOMContentLoaded', fire, false);
  };
  document.addEventListener('DOMContentLoaded', fire, false);
});

このpromisethenしていけば、「まだDOMContentLoadedしていなければ、それまで待つ」「すでにDOMContentLoadedしていれば、その場で非同期実行」というような挙動となります。

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.