-
Notifications
You must be signed in to change notification settings - Fork 389
Description
In node 0.10.x Cross library async interleaving can result in (node) warning: Recursive process.nextTick detected. This will break in the next version of node. Please use setImmediate for recursive deferral.
Although, when typically avoids this with its own micro task queue:
Line 25 in 25b3c0a
| asap = function (f) { return process.nextTick(f); }; |
In some scenarios, it is possible to interleave two such micro tasks queues in a way that still results in the limit being hit.
In addition to interleaving between different libraries due to the node_module's dupe friendly module resolution strategy, it is common to have multiple copies of the same library present and interacting with one another.
A quick example:
var A = require('./path/to/rsvp_a').Promise;
var B = require('./path/to/rsvp_b').Promise;
A.resolve().then(function() {
console.log('first nextTick');
B.resolve().then(function() {
console.log('second nextTick');
A.resolve().then(function() {
console.log('third nextTick');
});
});
});An example failing test thanks to @taras https://github.com/tildeio/rsvp.js/pull/337/files#diff-e7e77ddad631a023d39a62f3ba8b7f17R2524
this limit has been removed in node 0.11.0
nodejs/node@0761c90
nodejs/node@0761c90
Unfortunately our solution was to fallback to setImmediate in node 0.10.x.
I wasn't able to think of a better solution, but that doesn't mean a better one doesn't exist so if someone has one feel free to share :)
related:
tildeio/rsvp.js#337
petkaantonov/bluebird#399
kriskowal/asap#51