# 🦉 Utils 🦉 Owl export a few useful utility functions, to help with common issues. Those functions are all available in the `owl.utils` namespace. ## Content - [`whenReady`](#whenready): executing code when DOM is ready - [`loadJS`](#loadjs): loading script files - [`loadFile`](#loadfile): loading a file (useful for templates) - [`escape`](#escape): sanitizing strings - [`debounce`](#debounce): limiting rate of function calls - [`shallowEqual`](#shallowequal): shallow object comparison ## `whenReady` The function `whenReady` returns a `Promise` resolved when the DOM is ready (if not ready yet, resolved directly otherwise). If called with a callback as argument, it executes it as soon as the DOM ready (or directly). ```js Promise.all([loadFile("templates.xml"), owl.utils.whenReady()]).then(function ([templates]) { const qweb = new owl.QWeb({ templates }); const env = { qweb }; await mount(App, { env, target: document.body }); }); ``` or alternatively: ```js owl.utils.whenReady(function () { const qweb = new owl.QWeb(); const env = { qweb }; await mount(App, { env, target: document.body }); }); ``` ## `loadJS` `loadJS` takes a url (string) for a javascript resource, and loads it (by adding a script tag in the document head). It returns a promise, so the caller can properly reacts when it is ready. Also, it is smart: it maintains a list of urls previously loaded (or currently being loaded), and prevent doing twice the work. For example, it is useful for lazy loading external libraries: ```js class MyComponent extends owl.Component { willStart() { return owl.utils.loadJS("/static/libs/someLib.js"); } } ``` ## `loadFile` `loadFile` is a helper function to fetch a file. It simply performs a `GET` request and returns the resulting string in a promise. The initial usecase for this function is to load a template file. For example: ```js async function makeEnv() { const templates = await owl.utils.loadFile("templates.xml"); const qweb = new owl.QWeb({ templates }); return { qweb }; } ``` Note that unlike `loadJS`, this function returns the content of the file as a string. It does not add a `script` tag or any other side effect. ## `escape` Sometimes, we need to display dynamic data (for example user-generated data) in the user interface. If this is done by a `QWeb` template, it is not an issue: ```xml