Closed RubenVerborgh closed 4 years ago
@rubensworks The problem with using queueMicrotask
is that it precedes browser rendering, i.e., it behaves as if it is one long continuous piece of code.
An way around this, is to use a wrapper function that makes every 1 in 100 (or so) calls a setImmediate
/ setTimeout
call.
Such unpredictable behavior is of course hard for tests, so I would switch it off by default.
However, the question is whether it could also create undesired behavior outside of test environments.
I personally don't think it does: the tests simulate worst-case behavior, where we want to test certain race conditions and hence are more timing-sensitive. In fact, I just tried changing queueMicrotask
by setImmediate
in the code file, and only 1 case fails (spanning 3 out of 1563 tests), and it is literally testing a race condition ("a BufferedIterator that is being closed while reading is in progress").
So do you think we can safely, by default or otherwise, enable such switched behavior in browsers?
A wrapper to make every 1 in x calls a setImmediate or so sounds like a good idea. I also ran into problems related to this during testing (which will most likely also occur in production).
I would consider enabling this wrapper by default, but provide the functionality to disable/adjust this. Developers could then easily make use of this lib with a sane default config that works in most situations. If needed, they could still adjust manually. Also for tests, they could reconfigure if needed.
I first thought about just enabling this in browsers, but not in Node. But after thinking about this a bit more, I wouldn't do this, as this may cause confusion among developers, as they may not expect this.
Will be needed to prevent browser freezes (https://github.com/solid/query-ldflex/issues/45#issuecomment-646120333)