ready.js 660 B

1234567891011121314151617181920212223242526272829303132
  1. // @ts-check
  2. /**
  3. * @param {(() => void) | (() => Promise<void>)} callback
  4. * @returns {Promise<void>}
  5. */
  6. export default function ready(callback) {
  7. return new Promise((resolve, reject) => {
  8. function loaded() {
  9. let result;
  10. try {
  11. result = callback();
  12. } catch (err) {
  13. reject(err);
  14. return;
  15. }
  16. if (typeof result?.then === 'function') {
  17. result.then(resolve).catch(reject);
  18. } else {
  19. resolve();
  20. }
  21. }
  22. if (['interactive', 'complete'].includes(document.readyState)) {
  23. loaded();
  24. } else {
  25. document.addEventListener('DOMContentLoaded', loaded);
  26. }
  27. });
  28. }