LoginSignup
12
6

More than 5 years have passed since last update.

onLoad系のイベントをPromise化する

Posted at

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していれば、その場で非同期実行」というような挙動となります。

12
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
6