/** * Wait for some test to be true, returns a promise that resolves when condition is met. * Useful to wait for element render, for example. Uses requestAnimationFrame. * * @param {Function} testFn Test function to call. Should return true to resolve and false to continue testing. * @param {Number} maxTries Maximum number of rounds to test. If exceeded, the promise rejects. Defaults to 5000. * @return {Promise} Promise that resolves when test passes or rejects when maxTries is reached */ export const waitFor = (testFn, maxTries = 5000) => { return new Promise((resolve, reject) => { let tries = 0; const boundTestFn = testFn.bind(this); function waiter() { if (tries === maxTries) { return reject(new Error('waitFor: maximum tries exceeded')); } if (!boundTestFn()) { window.requestAnimationFrame(waiter); tries++; return; } resolve(true); } waiter(); }); }