33 lines
		
	
	
		
			660 B
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			33 lines
		
	
	
		
			660 B
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| // @ts-check
 | |
| 
 | |
| /**
 | |
|  * @param {(() => void) | (() => Promise<void>)} callback
 | |
|  * @returns {Promise<void>}
 | |
|  */
 | |
| export default function ready(callback) {
 | |
|   return new Promise((resolve, reject) => {
 | |
|     function loaded() {
 | |
|       let result;
 | |
|       try {
 | |
|         result = callback();
 | |
|       } catch (err) {
 | |
|         reject(err);
 | |
| 
 | |
|         return;
 | |
|       }
 | |
| 
 | |
|       if (typeof result?.then === 'function') {
 | |
|         result.then(resolve).catch(reject);
 | |
|       } else {
 | |
|         resolve();
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     if (['interactive', 'complete'].includes(document.readyState)) {
 | |
|       loaded();
 | |
|     } else {
 | |
|       document.addEventListener('DOMContentLoaded', loaded);
 | |
|     }
 | |
|   });
 | |
| }
 |