diff --git a/src/helpers.js b/src/helpers.js index afafe115..1fefa0b8 100644 --- a/src/helpers.js +++ b/src/helpers.js @@ -17,4 +17,20 @@ function getDocument() { return window.document } -export {getDocument, newMutationObserver} +/* + * There are browsers for which `setImmediate` is not available. This + * serves as a polyfill of sorts, adopting `setTimeout` as the closest + * equivalent + */ +function getSetImmediate() { + /* istanbul ignore else */ + if (typeof setImmediate === 'function') { + return setImmediate + } else { + return function setImmediate(fn) { + return setTimeout(fn, 0) + } + } +} + +export {getDocument, newMutationObserver, getSetImmediate} diff --git a/src/wait-for-dom-change.js b/src/wait-for-dom-change.js index a4ef4841..9855ea9c 100644 --- a/src/wait-for-dom-change.js +++ b/src/wait-for-dom-change.js @@ -1,4 +1,4 @@ -import {newMutationObserver, getDocument} from './helpers' +import {newMutationObserver, getDocument, getSetImmediate} from './helpers' function waitForDomChange({ container = getDocument(), @@ -11,6 +11,7 @@ function waitForDomChange({ }, } = {}) { return new Promise((resolve, reject) => { + const setImmediate = getSetImmediate() const timer = setTimeout(onTimeout, timeout) const observer = newMutationObserver(onMutation) observer.observe(container, mutationObserverOptions) @@ -24,9 +25,11 @@ function waitForDomChange({ resolve(result) } } + function onMutation(mutationsList) { onDone(null, mutationsList) } + function onTimeout() { onDone(new Error('Timed out in waitForDomChange.'), null) } diff --git a/src/wait-for-element.js b/src/wait-for-element.js index 41e92092..82e47a3f 100644 --- a/src/wait-for-element.js +++ b/src/wait-for-element.js @@ -1,4 +1,4 @@ -import {newMutationObserver, getDocument} from './helpers' +import {newMutationObserver, getDocument, getSetImmediate} from './helpers' function waitForElement( callback, @@ -22,6 +22,7 @@ function waitForElement( const observer = newMutationObserver(onMutation) observer.observe(container, mutationObserverOptions) function onDone(error, result) { + const setImmediate = getSetImmediate(); clearTimeout(timer) setImmediate(() => observer.disconnect()) if (error) {