Skip to content

Instantly share code, notes, and snippets.

@gabemeola
Created November 14, 2019 17:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save gabemeola/b9c8c9137557fe5ab3d174d10848a26e to your computer and use it in GitHub Desktop.
Save gabemeola/b9c8c9137557fe5ab3d174d10848a26e to your computer and use it in GitHub Desktop.
requestOnIdle.js
const isRequestIdleCallbackSupported =
'requestIdleCallback' in window &&
typeof window.requestIdleCallback === 'function';
/**
* A higher order function that wraps passed function to run
* inside of a requestIdleCallback or "onload" event
* depending on what is supported in the browser.
*
* This is useful for running low priority app level bootstrapping events.
*
* @param {Function} fn - Function to requestIdleCallback when called
* @return {Function<Promise>} - Returns a function that returns a Promise of the return value.
*/
export default function requestOnIdle(fn) {
return (...args) => {
return new Promise(resolve => {
const loadFn = () => {
// Call passed function with same args
// and Resolve Promise
resolve(fn(...args));
// Remove listener if requestIdleCallback is not supported
if (isRequestIdleCallbackSupported === false) {
window.removeEventListener('load', loadFn);
}
};
if (isRequestIdleCallbackSupported) {
window.requestIdleCallback(loadFn);
return;
}
// Add load eventListener
window.addEventListener('load', loadFn);
});
};
}
afterEach(() => {
// Clean up
delete window.requestIdleCallback;
jest.resetModules();
});
it('should use requestIdleCallback if supported', () => {
const load = jest.fn();
window.requestIdleCallback = jest.fn();
const requestOnIdle = require('../requestOnIdle').default;
requestOnIdle(load)();
expect(window.requestIdleCallback).toHaveBeenCalledTimes(1);
});
it('should use eventListeners if requestIdleCallback is not supported', done => {
const load = jest.fn();
window.addEventListener = jest.fn((event, eventListener) => {
expect(event).toBe('load');
window.removeEventListener = jest.fn((event, removeListener) => {
expect(event).toBe('load');
expect(eventListener).toBe(removeListener);
delete window.removeEventListener;
done();
});
// Call Listener
eventListener();
});
const requestOnIdle = require('../requestOnIdle').default;
requestOnIdle(load)();
expect(window.addEventListener).toHaveBeenCalled();
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment