We discovered a serious flaw in how IE10 handles timing in setImmediate and MessageChannel. It renders these APIs practically useless on IE10 Mobile and somewhat unreliable on IE10 Desktop.
On IE10 Mobile, setImmediate callbacks are called only when there is nothing else that could be run at the time. If there are setTimeout(fn, 0) functions being called that (in total) take all the CPU time, the setImmediate callback will never be called.
The same bug occurs also when trying to achieve the effect of setImmediate through the use of MessageChannel.
Simply adding a spin.js spinner on our login page caused all Q promises to stop working on IE10 Mobile. The Q promises use setImmediate, and MessageChannel as a fallback.
On IE10 Desktop the same bug occurs, though in more specific conditions (see reproduction instructions).
A more thorough explanation of the bug is on my blog: http://codeforhire.com/2013/09/21/setimmediate-and-messagechannel-broken-on-internet-explorer-10/