AFAIK `setImmediate(f)` is conceptually === `setTimeout(f, 0)`

The setImmediate queue is dispatched **only once** per event loop turn, like so:

1.- Grab the setImmediateQueue, call it currentSetImmediateQueue,
2.- Put a new, empty, setImmediateQueue in its place
3.- Call everything that's in the currentSetImmediateQueue

But the netTick queue is serviced **more than once, as often as needed** per event loop turn, like so:

```js
while (nextTickQueue.length) nextTickQueue.shift()()
```

So:

1.- When you add an item to the nextTickQueue from a function in the nextTickQueue, it will simply make that `while()` loop above loop once more, but when you add an item to the setImmediateQueue, the newly added item won't run until the next turn of the event loop (and many other callbacks may have been called in-between, by then)
2.- Recursively adding to the nextTickQueue blocks the event loop.
3.- Recursively adding to the setImmediateQueue does not block the event loop.
4.- If you want to be totally sure that no other callback (*) runs before `f`, use `.nextTick(f)`.

(*) Any other cb that was already in the nextTickQueue will still run before `f`, though.