diff --git a/lib/timers.js b/lib/timers.js index f4a60690c6e..76a9cdaafe5 100644 --- a/lib/timers.js +++ b/lib/timers.js @@ -313,18 +313,24 @@ L.init(immediateQueue); function processImmediate() { - var immediate = L.shift(immediateQueue); + var queue = immediateQueue; - if (L.isEmpty(immediateQueue)) { - process._needImmediateCallback = false; + immediateQueue = {}; + L.init(immediateQueue); + + while (L.isEmpty(queue) === false) { + var immediate = L.shift(queue); + var domain = immediate.domain; + if (domain) domain.enter(); + immediate._onImmediate(); + if (domain) domain.exit(); } - if (immediate._onImmediate) { - if (immediate.domain) immediate.domain.enter(); - - immediate._onImmediate(); - - if (immediate.domain) immediate.domain.exit(); + // Only round-trip to C++ land if we have to. Calling clearImmediate() on an + // immediate that's in |queue| is okay. Worst case is we make a superfluous + // call to NeedImmediateCallbackSetter(). + if (L.isEmpty(immediateQueue)) { + process._needImmediateCallback = false; } }