const FAST_LOAD_TIME = 500; const clamp = (num, min, max) => Math.min(Math.max(num, min), max); function loadAndWait(minimumLoadTime = FAST_LOAD_TIME) { const startedLoading = + new Date(); return function waitMinimum() { return new Promise(resolve => { const loadDuration = new Date() - startedLoading; const waitTime = clamp(minimumLoadTime-loadDuration, 0, minimumLoadTime); setTimeout(resolve, waitTime); }); } } async function doSomething() { const waitMinimum = loadAndWait(); // Do something that the user expects to take some time, e.g. loading data ... await waitMinimum(); }